3

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

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)上说“错误:预期的构造函数、析构函数或类型转换之前的'*'标记”

4

1 回答 1

4

您需要限定inner该类是typename,因为它依赖于模板参数,并且 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<int>::inner不再命名类型;它命名一个成员变量。

因此,在一般情况下, 的含义将是模棱两可的,并且 C++ 解决了这种模棱两可的假设,假设没有outer<t>::inner命名inner类型。除非你这么说,否则在它前面加上: 。(在这种情况下,称为从属名称,因为它取决于 . 的确切类型。)typenametypename outer<t>::innerinnert

于 2010-03-21T14:39:47.063 回答