依赖类型通常需要 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
关键字的位置突然变得重要。
关于c++ - 为什么 'typedef' 这个词后面需要 'typename' 作为依赖类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625119/