возможно ли иметь шаблонные классы внутри шаблонного класса? - PullRequest
1 голос
/ 06 ноября 2008
template <class M, class A> class C { std::list<M> m_List; ... }

Возможен ли приведенный выше код? Я хотел бы иметь возможность сделать что-то подобное.

Почему я спрашиваю, что я получаю следующую ошибку:

Error 1 error C2079: 'std::_List_nod<_Ty,_Alloc>::_Node::_Myval' uses undefined class 'M'   C:\Program Files\Microsoft Visual Studio 9.0\VC\include\list    41

Ответы [ 4 ]

4 голосов
/ 06 ноября 2008

Полагаю, вы куда-то отправили объявленный класс M и полностью объявили его только после создания шаблона.

Мой совет: присвойте своим формальным аргументам шаблона имя, отличное от фактических. (т.е. класс М)

// template definition file
#include <list>

template< class aM, class aT >
class C {
    std::list<M> m_List;
    ...
};

Пример неверного форвардного объявления, приводящего к указанной ошибке:

// bad template usage file causing the aforementioned error
class M;
...
C<M,OtherClass> c; // this would result in your error

class M { double data; };

Пример правильного объявления, не приводящего к ошибке:

// better template usage file
class M { double data; }; // or #include the class header
...

C<M,OtherClass> c; // this would have to compile
2 голосов
/ 06 ноября 2008

Да. Это очень распространено.

Как упоминалось в xtofl, предварительное объявление вашего параметра может вызвать проблему во время создания шаблона, что похоже на то, на что намекает сообщение об ошибке.

1 голос
/ 06 ноября 2008

Это очень распространенное использование.

Вы должны убедиться, что класс M, указанный в качестве параметра шаблона, полностью объявлен перед созданием первого экземпляра класса C. Возможно, вам не хватает заголовочного файла include или, возможно, это проблема пространства имен.

0 голосов
/ 06 ноября 2008

Да.

Он часто используется STL для таких вещей, как распределители и итераторы.

Похоже, вы столкнулись с какой-то другой проблемой. Возможно, вам не хватает шаблона в определении тела внепланового метода, который был впервые объявлен в ... вы удалились?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...