У меня есть шаблон класса
template<class T1 ,class T2, class T3>
class server_fd
{
T1 servport;
T2 server_ip;
T3 servobj;
int local_port;
public:
server_fd(const T1& servport, const T2& server_ip,const T3 servobj) {
this->servport=servport;
this->server_ip=server_ip;
this->servobj=servobj;
cout <<"check \n"<<this->server_ip;
}
};
Теперь я хочу сохранить объект этого класса на карте, поэтому я объявляю карту следующим образом.
map<int,server_fd* > MapPairList;
После этого, когда я компилирую свой код, это выдает эту ошибку
ошибка: аргумент шаблона 2 неверен
ошибка: неверный аргумент шаблона 4
Однако, если я не использую шаблонный класс, я могу определить карту успешно.
Есть ли другой способ определить карту для хранения объекта класса шаблона? Пожалуйста, дайте мне знать.
Попробуйте добавить базовый класс в свой шаблонный класс:
class server_fd_entry {};
template<class T1 ,class T2, class T3>
class server_fd
{
<snip>
}
...
map<int,server_fd_entry* > MapPairList;
Таким образом, карта может хранить все типы server_fd независимо от параметров шаблона. Однако я вижу, что это приводит к значительному снижению производительности, поэтому альтернативой является обеспечение того, чтобы вы указали все параметры шаблона при объявлении карты:
map<int,server_fd<int,int,int>* >
Таким образом, вы можете хранить только один конкретный тип server_fd, но если это все, что вам нужно, он, вероятно, будет аккуратнее.
Если вы можете каким-то образом абстрагировать доступ к этим типам, вы можете сделать так, чтобы ваш шаблонный класс наследовал от абстрактного базового класса, а затем просто сохранять указатели на базу на вашей карте.
Это называется стирание типа, и вы можете получить больше информации об этом здесь Типы техники стирания