我有一个像这里一样的模板类(在标头中),其中包含一个内部类和一个指向内部类的类型指针的静态成员
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)
您需要证明inner
类是一个typename,因为它依赖于模板参数,并且 C++ 编译器假定名称inner
在这种情况下是not a type:
template <class t> typename outer<t>::inner* outer<t>::m;
理由:名称inner
上面的行取决于类型名称,t
。 C++编译器此时不知道什么inner
是,因为名字的意思inner
可能会有所不同,具体取决于t
。例如,假设在代码的其他地方,有一个专门的版本outer
类为int
:
template <>
class outer<int> {
int inner;
};
Now, outer<int>::inner
不再命名类型;它命名一个成员变量。
因此,在一般情况下的含义outer<t>::inner
将是不明确的,C++ 解决了这种不明确性,假设inner
does not命名一个类型。除非你这么说,否则在它前面加上前缀typename
: typename outer<t>::inner
。 (在这种情况下,inner
被称为附属名称因为这取决于具体的类型t
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)