为什么对于依赖类型,单词 'typedef' 后面需要'typename'?

Why does the word 'typedef' need 'typename' after it for dependent types?

本文关键字:typedef typename 单词 于依赖 依赖 类型 为什么      更新时间:2023-10-16

依赖类型通常需要 typename告诉编译器成员是一种类型,而不是函数或变量。

但是,这是不是总是这样。
例如,基类不需要这个,因为它只能是一种类型:

template<class T> struct identity { typedef T type; }
template<class T> class Vector : identity<vector<T> >::type { };  // no typename

现在我的问题是,为什么typedef>?

之后都需要typename
template<class T> class Vector
{
    typedef typename /* <-- why do we need this? */ vector<T>::iterator iterator;
};

typedef不需要出现在类型之前。

template <typename T>
struct S { typedef T type; };
template <typename T>
void f() { typename S<T>::type typedef t; }

这是完全有效的,在这种情况下,我希望您可以理解,如果typename是可选的,解析会很复杂。

我可以理解

template <typename T>
void f() { typedef S<T>::type t; }

可以用不同的解释来解释,但这会引入意外情况,使typedef关键字的位置突然变得很重要。