О, спасибо!)
Все заработало когда в ф-цию 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 везде прописано... В чем ошибка?
Проблема с добавлением объекта в множество(set)
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 20
- Зарегистрирован: 12 ноя 2013, 21:50
Что бы заработало нужно было только сменить добавление объекта в ф-ции add
теперь все работает) но непонятно почему нельзя было объявить объект выше и передать как было раньше? В не шаблонных ф-циях это работало...
С геттерами все так гладко не получилось...
объявления пришлось оставить в классе, без них выдавало ошибку
Сейчас все так и работает:
Так нормально?) Или Вы можете еще что-то посоветовать?) Буду очень благодарен)
Код: Выделить всё
template <class T> void add()
{
getSet<T>().insert(T());
}
С геттерами все так гладко не получилось...
объявления пришлось оставить в классе, без них выдавало ошибку
#pragma once прописано везде, так что мне тоже не очень понятно что это за ошибка...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
Сейчас все так и работает:
Код: Выделить всё
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;
}
-
- Сообщения: 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;
}
Так нормально?) Или Вы можете еще что-то посоветовать?) Буду очень благодарен)
объявления пришлось оставить в классе, без них выдавало ошибку
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. Оба компилятора не испытывали трудностей.
По поводу того, что я ещё могу посоветовать. Даже не знаю. Задача ведь решена. Ставь новые задачи - буду ругать или хвалить
По поводу того, что пришлось оставить объявление специализаций внутри класса - удивлён. Должно работать и без них. Возможно, особенность компилятора. Я свой тестовый код компилировал 2010-й студией и 5-ым xlc на RISC. Оба компилятора не испытывали трудностей.
По поводу того, что я ещё могу посоветовать. Даже не знаю. Задача ведь решена. Ставь новые задачи - буду ругать или хвалить

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