C++ 使用内部类指针类型定义模板类的静态成员

Jac*_*ack 4 static templates pointers class member

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

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

    static inner *m;
};

template <class t> outer <t>::inner *outer <t>::m;
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*lph 5

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

\n\n
template <class t> typename outer<t>::inner* outer<t>::m;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
template <>\nclass outer<int> {\n    int inner;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

因此,在一般情况下, 的含义outer<t>::inner是不明确的,并且 C++ 假设 不命名类型来解决这种不inner明确。除非您这么说,否则请在其前面加上typename:前缀typename outer<t>::inner。(在这种情况下,inner称为从属名称,因为它取决于 的确切类型t。)

\n