【问题标题】:c++ defining a static member of a template class with type inner class pointerc ++定义具有类型内部类指针的模板类的静态成员
【发布时间】:2010-03-21 14:36:07
【问题描述】:

我有一个像这里这样的模板类(在标题中),它有一个内部类和一个指向内部类的类型指针的静态成员

template <class t> class outer {
    class inner {
        int a;
    };

    static inner *m;
};

template <class t> outer <t>::inner *outer <t>::m;

当我想定义该静态成员时,我在最后一行 (mingw32-g++ 3.4.5) 上说“错误:预期的构造函数、析构函数或类型转换之前的 '*' 标记”(mingw32-g++ 3.4.5)

【问题讨论】:

  • 您对空格的使用使最后一行难以正确阅读。我不得不认真思考片刻才能理解它的含义。基本上,你撕开属于一起的东西(类型名、模板参数、指针限定符)并将不属于一起的东西粘合在一起(指针限定符、变量名)。

标签: class static templates pointers member


【解决方案1】:

您需要限定inner 类是一个类型名,因为它依赖于模板参数并且C++ 编译器假定此上下文中的名称inner 不是 一个类型:

template <class t> typename outer<t>::inner* outer<t>::m;

基本原理:上一行中的名称inner 取决于类型名称t。此时的 C++ 编译器不知道 inner 是什么,因为名称 inner 的含义可能因 t 而不同。例如,假设在代码的其他地方,有一个专用版本的 outer 类 int:

template <>
class outer<int> {
    int inner;
};

现在,outer&lt;int&gt;::inner 不再命名类型;它命名一个成员变量。

因此,在一般情况下,outer&lt;t&gt;::inner 的含义将是模棱两可的,而 C++ 解决了这种模棱两可的问题,假设 inner 确实没有命名一个类型。除非你这么说,否则在它前面加上typename:typename outer&lt;t&gt;::inner。 (在这种情况下,inner 被称为 从属名称,因为它取决于 t 的确切类型。)

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多