2014-03-13 50 views
2

只是想知道C++ typename,用於告訴解析器某些符號是類型。爲什麼我們必須在typedef之後使用它而不是繼承?typedef中的typename與繼承的用法

示例:假設你有這樣的

struct C { /* a class */ }; 
template<class T> struct S { 
    typedef C type; // S<T>::type is a type 
}; 

什麼困擾我的是這樣的:

template<class T> struct Typedef { 
    typedef typename S<T>::type MyType; // needs typename 
}; 
template<class T> struct Inheritance 
    : S<T>::type      // doesn't need typename 
{ }; 

在這兩種情況下,解析器應該期待一個類型,所以它可以解析S<T>::type爲一體。爲什麼它只爲繼承而不是typedefs?該模式似乎同樣對我說:

typedef $type$ $new_symbol$; 
class $new_symbol$ : $type$ { $definition$ }; 

還是有的typedef使用情況我不知道,這讓這個曖昧? PS:我很肯定這已經被問到了,但是我找不到(有很多噪音與typename關鍵字有關)。這個問題只是關於語法,而不是使用繼承或typedefs更好。如果有重複的話,我提前道歉。

+0

它已經被回答過。看看這裏:http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords – lapk

+0

@PetrBudnik該鏈接不實際上包含對這個特定問題的答案。 –

+0

@KonradRudolph它確實如此,非常詳細。閱讀接受的答案部分**「typename」關鍵字**和**其他註釋和示例**。 – lapk

回答

3

原因是typedef語法比繼承語法更可變。 正常情況下你會寫typedef第一個,而類型名稱第二個。但這個命令實際上並不重要。要機智,下面是一個有效的typedef

int typedef integer_type; 

現在考慮,如果我們使用一個從屬名稱會發生​​什麼:

S<T>::type typedef integer_type; 

沒有做一些不平凡的前瞻,分析器無法知道S<T>::type指到這裏的類型名稱(因爲它還沒有看到typedef),所以通過消歧規則它推斷出一個值。爲了語法的一致性,前綴typedef(其中,你是對的,毫不含糊)沒有特殊情況。可能有一個特例,但根本沒有。

+0

感謝您的這篇短文和重點!我不知道這個語法,這正是我所期待的;) – Antoine