C ++ typename和内部类

时间:2010-10-14 15:13:53

标签: c++ templates

我试过谷歌搜索,但我无法找到合适的答案。任何C ++专家都可以告诉我为什么C ++要求你用typename关键字声明OuterClass <T> :: Innerclass?

我是数据结构课程的助教,我一直看到这个错误。我知道要告诉我的学生他们需要将typename放在返回类型前面,但我无法解释为什么需要这样做。

感谢。

2 个答案:

答案 0 :(得分:6)

这是因为模板中的两阶段名称查找。当编译器看到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
};

答案 1 :(得分:5)

OuterClass<T>::Innerclass

因为Innerclass代表type(我可以从您的问题中看到),所以您需要在OuterClass<T>::Innerclass之前添加关键字typename

示例:

template <class T>
void foo() {
   T::iterator * iter;
   ...
}

typename T::iterator * iter;将被解释为T::iteratoriter之间的乘法运算