2014-02-07 21 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

相關問題