C++ std::vector с указателями на шаблонный класс
В проекте, над которым я работаю, я пытаюсь создать вектор с указателями на шаблонный класс.
template <typename T>
std::vector<templateClass<T>*> vec;
Тем не менее, это дает мне две ошибки:
Error C2133: vec : unknown size
Error C2998: std::vector<templateClass<T>*> vec : cannot be a template definition
Если я изменю код на:
std::vector<templateClass<int>*> vec;
Он работает нормально, поэтому я думаю, проблема не в том, что вы не можете использовать шаблоны классов с векторами, а в том, что вам нужно сообщить компилятору, какой тип использовать. Есть ли способ обойти это?
4 ответа
Когда вы создаете экземпляр класса, вы должны выбрать тип. В определении вы можете написать T, но в момент создания экземпляра вы должны указать тип.
Поэтому, если вы хотите определить, а не создавать экземпляр, используйте typedef
,
Похоже, вы пытаетесь определить новый тип vec<T>
как кратчайший путь к более длинному храмовому выражению. Как правило, это будет сделано с typedef
Однако C++ не поддерживает хранимые typedefs.
Обратите внимание, что в текущем коде вы пытаетесь определить переменную vec
, но вы не даете ему конкретный тип для T, и поэтому компилятор жалуется.
Вы не можете иметь шаблонного члена.
Шаблон должен исходить из шаблонного объявления класса или функции.
template <typename T>
class blah {
std::vector<templateClass<T>*> vec;
}
Компилятору нужно определить шаблонное имя типа где-то в коде, например: blah<int>
Если бы у вас был шаблонный элемент, вы не могли бы определить тип где-либо в коде, и компилятор не смог бы определить тип элемента.
Шаблонное имя типа определяется, когда вы впервые используете функцию или класс (явно или неявно), поэтому вам нужно иметь определение и реализацию шаблона в каком-то месте, доступном для вызывающего кода.
В настоящее время C++ не поддерживает шаблонные определения типов, поэтому вам нужно использовать наиболее распространенное решение, предложенное Хербом Саттером (http://gotw.ca/gotw/079.htm).