Проблема с добавлением объекта в множество(set)

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Titarenko_Vlad
Сообщения: 20
Зарегистрирован: 12 ноя 2013, 21:50

О, спасибо!)
Все заработало когда в ф-цию add сделал как у Вас:
template <class T> void add()
{
getSet<T>().insert(T());
}
Я только не понял, почему нельзя было объявить объект выше и передать его в insert как было раньше, в нешаблонных ф-циях это работало.
И еще не получилось вынести частные геттеры за класс, выдает такую ошибку на каждый сэт:
error LNK2005: "private: class std::set<class AutoConfiguration,struct std::less<class AutoConfiguration>,class std::allocator<class AutoConfiguration> > & __thiscall AutoShop::getSet<class AutoConfiguration>(void)" (??$getSet@VAutoConfiguration@@@AutoShop@@AAEAAV?$set@VAutoConfiguration@@U?$less@VAutoConfiguration@@@std@@V?$allocator@VAutoConfiguration@@@3@@std@@XZ) already defined in autoShop.obj

Оставил так:
class AutoShop
{
string name;
string address;
int amountCarsSold;
double gainsMoney;
set<Manager> managerSet;
set<Client> clientSet;
set<AutoConfiguration> autoConfigurationSet;
template <class T> set<T>& getSet();
template<> set<Manager>& getSet<Manager>()
{
return managerSet;
}
template<> set<Client>& getSet<Client>()
{
return clientSet;
}
template<> set<AutoConfiguration>& getSet<AutoConfiguration>()
{
return autoConfigurationSet;
}
public:
AutoShop(string _name, string _address);
template <class T> void add()
{
getSet<T>().insert(T());
}
void showAll();
template <class T> void show()
{
set<T>::iterator iter;
iter=getSet<T>().begin();
while(iter!=getSet<T>().end())
{
(*iter).show();
iter++;
}
}

#pragma once везде прописано... В чем ошибка?
Titarenko_Vlad
Сообщения: 20
Зарегистрирован: 12 ноя 2013, 21:50

Что бы заработало нужно было только сменить добавление объекта в ф-ции add

Код: Выделить всё

template <class T> void add()
	{
		getSet<T>().insert(T());
	}
теперь все работает) но непонятно почему нельзя было объявить объект выше и передать как было раньше? В не шаблонных ф-циях это работало...

С геттерами все так гладко не получилось...
объявления пришлось оставить в классе, без них выдавало ошибку
error LNK2005: "private: class std::set<class Manager,struct std::less<class Manager>,class std::allocator<class Manager> > & __thiscall AutoShop::getSet<class Manager>(void)" (??$getSet@VManager@@@AutoShop@@AAEAAV?$set@VManager@@U?$less@VManager@@@std@@V?$allocator@VManager@@@3@@std@@XZ) already defined in autoShop.obj
#pragma once прописано везде, так что мне тоже не очень понятно что это за ошибка...

Сейчас все так и работает:

Код: Выделить всё

class AutoShop
{
	string name;
	string address;
	int amountCarsSold;
	double gainsMoney;
	set<Manager> managerSet;
	set<Client> clientSet;
	set<AutoConfiguration> autoConfigurationSet;
	template <class T> set<T>& getSet();
	template<> set<Manager>& getSet<Manager>();
	template<> set<Client>& getSet<Client>();
	template<> set<AutoConfiguration>& getSet<AutoConfiguration>();
public:
	AutoShop(string _name, string _address);
};

template<> set<Manager>& AutoShop::getSet<Manager>()
{
	return managerSet;
}
template<> set<Client>& AutoShop::getSet<Client>()
{
	return clientSet;
}
template<> set<AutoConfiguration>& AutoShop::getSet<AutoConfiguration>()
{
	return autoConfigurationSet;
}
Так нормально?) Или Вы можете еще что-то посоветовать?) Буду очень благодарен)
Titarenko_Vlad
Сообщения: 20
Зарегистрирован: 12 ноя 2013, 21:50

С геттерами все так гладко не получилось...
объявления пришлось оставить в классе, без них выдавало ошибку
error LNK2005: "private: class std::set<class Manager,struct std::less<class Manager>,class std::allocator<class Manager> > & __thiscall AutoShop::getSet<class Manager>(void)" (??$getSet@VManager@@@AutoShop@@AAEAAV?$set@VManager@@U?$less@VManager@@@std@@V?$allocator@VManager@@@3@@std@@XZ) already defined in autoShop.obj

#pragma once прописано везде, так что мне тоже не очень понятно что это за ошибка...

Сейчас все так и работает
class AutoShop
{
string name;
string address;
int amountCarsSold;
double gainsMoney;
set<Manager> managerSet;
set<Client> clientSet;
set<AutoConfiguration> autoConfigurationSet;
template <class T> set<T>& getSet();
template<> set<Manager>& getSet<Manager>();
template<> set<Client>& getSet<Client>();
template<> set<AutoConfiguration>& getSet<AutoConfiguration>();
public:
AutoShop(string _name, string _address);
};

template<> set<Manager>& AutoShop::getSet<Manager>()
{
return managerSet;
}
template<> set<Client>& AutoShop::getSet<Client>()
{
return clientSet;
}
template<> set<AutoConfiguration>& AutoShop::getSet<AutoConfiguration>()
{
return autoConfigurationSet;
}

Так нормально?) Или Вы можете еще что-то посоветовать?) Буду очень благодарен)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

По поводу метода add - я всего лишь упростил код, у меня работает и так, и этак.

По поводу того, что пришлось оставить объявление специализаций внутри класса - удивлён. Должно работать и без них. Возможно, особенность компилятора. Я свой тестовый код компилировал 2010-й студией и 5-ым xlc на RISC. Оба компилятора не испытывали трудностей.

По поводу того, что я ещё могу посоветовать. Даже не знаю. Задача ведь решена. Ставь новые задачи - буду ругать или хвалить :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Titarenko_Vlad
Сообщения: 20
Зарегистрирован: 12 ноя 2013, 21:50

Спасибо) Если что, обязательно напишу)
Ответить