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).

Другие вопросы по тегам