2014-02-07 23 views
8

相关类型通常需要typename来告诉编译器成员是一个类型,而不是函数或变量。为什么'typedef'这个单词在依赖类型后需要'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; 
}; 
+0

为什么不问一个关于例如'static'? –

+1

@ n.m .:哦,对不起,我现在明白了。是的,我没有想到这一点,但我认为这可能是因为默认情况下int ...默认情况下...所以'静态x;'将默认是'int'不是吗? (或者至少它会在C?)但是老实说不知道,这是一个很好的问题。 – Mehrdad

+0

大约15年前,C已经下降了隐式int :) – hvd

回答

7

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关键词的位置突然变得显著,这将带来意想不到的情况。

+0

当然,但是没有人说'typedef'后来应该是可选的吧? – Mehrdad

+0

@Mehrdad我引用你的问题:“现在我的问题是,为什么typedef需要typename?” – hvd

+0

您应该阅读标题,“为什么typedef'需要'typename' **在其**依赖类型之后”?如果这不是你正在回答的问题,那么它不是真的回答我的问题... – Mehrdad

相关问题