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
答案 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对分配器和迭代器之类的东西使用很多。
看起来你遇到了其他一些问题。也许你错过了一个外行方法体定义的模板,该模板首先在......你省略了吗?