【问题标题】:is it possible to have templated classes within a template class?模板类中是否可以有模板类?
【发布时间】:2008-11-06 15:21:20
【问题描述】:
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

【问题讨论】:

  • 我的应用程序出现此错误。错误 1 ​​错误 C2079: 'std::_List_nod<_ty>::_Node::_Myval' 使用未定义的类 'M' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\list 41
  • 那么也许您应该改写您的问题以在其中包含此错误(因为您提供的代码完全有效)。
  • 显示更多代码。这在 VC9 中编译得很好。刚试了一下。 #include 模板 class C { std::list m_List; };
  • 正如@xtofl 和@Joe Corkery 下面提到的,您遇到的错误可能是因为 std::list 在实例化 C 时需要 M 的完整定义。我同意@Baxissimo:如果您在使用 C 的地方添加代码,您将获得更好的帮助。

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


【解决方案1】:

我的猜测:您在某处转发声明的类 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

【讨论】:

  • 我在这里感觉到了一些心理调试。
  • 这怎么行?现在您的定义中有一个完全未定义的模板变量。这会导致错误任何类 C 被使用,除非已经有一个类 M 的定义 - 或者我完全错过了什么?
  • 这就是我的意思:这段代码是我对问题所在的猜测……显然,这并不清楚……
【解决方案2】:

是的。这很常见。

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

【讨论】:

    【解决方案3】:

    这是一个很常见的用法。

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

    【讨论】:

      【解决方案4】:

      是的。

      它被 STL 大量用于分配器和迭代器之类的东西。

      您似乎遇到了其他问题。也许您错过了第一次在...中声明的异常方法主体定义上的模板,您省略了?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        相关资源
        最近更新 更多