为什么vector<int>::iteator 不需要使用typename?

template <typename T>
class MyClass
{
public:
    typename T::myIterator a;
    typename T::myIterator2 b = 4;
private:
};

class ContatinsType
{
public:
    struct myIterator{ };
    typedef int myIterator2;
private:
};

对于不是用在模板中的模板参数名称,只有使用typename修饰编译器才会将改名称当成类型。
所以上面的代码使用typename修饰 T::myIterator。
可是在使用vector<int>::iterator时我们并不会使用typename啊,这是为什么?

阅读 2.9k
1 个回答

在模板内部,有一些结构的类型或值要依赖于模板参数才能决定。模板参数不定的时候,其类型不定,因而需要明确指明其类型。

T::myIteratorT 并不一定是什么类型,因而 T::myIterator 可能是任何东西,如类型、常量、函数等等。因而此时需要需要使用 typename 显式表明其为一个类型名。

这些叫做 "Dependent names"

vector<int> ,这已经是一个实实在在的类,其内部的所有成员都是确定的。因而 vector<int>::iterator 不需要加 typename

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题