是否可以在模板类中使用模板化的类?

时间:2008-11-06 15:21:20

标签: c++ oop visual-c++ templates

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 个答案:

答案 0 :(得分:4)

我的猜测:你将声明的类M转发到某个地方,并且只在模板实例化后完全声明它。

我的提示:给你的正式模板参数命名与实际名称不同。 (即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

答案 1 :(得分:2)

是。这很常见。

正如xtofl所提到的,参数的前向声明会在模板实例化时引起问题,这看起来就像错误信息所暗示的那样。

答案 2 :(得分:1)

这是一种非常常见的用法。

您应该确保在创建第一个C类实例之前完全声明了指定为模板参数的类M.也许您缺少一个头文件include或者这可能是命名空间问题。

答案 3 :(得分:0)

是。

STL对分配器和迭代器之类的东西使用很多。

看起来你遇到了其他一些问题。也许你错过了一个外行方法体定义的模板,该模板首先在......你省略了吗?