我试过谷歌搜索,但我无法得出一个合适的答案.任何C++专家都可以告诉我为什么C++要求你<T>用typename关键字声明OuterClass :: Innerclass?
我是数据结构课程的助教,我一直看到这个错误.我知道要告诉我的学生他们需要将typename放在返回类型的前面,但我无法解释为什么这是必需的.
谢谢.
那是因为模板中的两阶段名称查找.当编译器看到Innerclass时,它必须知道该名称是否是一个类型(例如,对于OuterClass的某些特化,可以是int类型的静态成员).所以它假设它不是类型名称,除非你这么说.typename必须在模板中使用,并且只能在依赖于模板参数的名称上使用.HTH
例:
template <class T>
class X
{
typedef T XXX;
};
template<>
class X<char>
{
static int XXX;
};
template<class T>
class Y
{
// X<T>::XXX member; invalid XXX is not assumed to be a type!
typename X<T>::XXX member;
//we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that
};
Run Code Online (Sandbox Code Playgroud)
OuterClass<T>::Innerclass
那是因为Innerclass代表一个type(从您的问题中可以看出),因此您需要在typename之前添加关键字OuterClass<T>::Innerclass
范例:
template <class T>
void foo() {
T::iterator * iter;
...
}
Run Code Online (Sandbox Code Playgroud)
不typename T::iterator * iter;将其解释为T::iterator和之间的乘法运算iter