2010-08-17 124 views
1

可能重複的目的:
Officially, what is typename for?什麼是C 「類型名稱」 ++

當我使用

template <typename TMap> 
typename TMap::referent_type * func(TMap & map, typename TMap::key_type key) 
{ ... } 

什麼是兩者的目的「類型名「在第二行?

它似乎會觸發編譯時警告(VS2008:C4346),但它只是一個「你聲稱這是一個類型」?

即實際檢查TMap::referent_type實際上是否是模板被實例化時產生的,但似乎仍有C++標準的要求,但代碼正確解析正確。

是否有任何實例需要typename來解決歧義?或者還有更多呢?

+0

我必須承認,對於C++標籤的人會提出這樣一個關於模板編程的基本問題,我們必須承認會有點吃驚。你有沒有編譯過比Visual Studio更好的編譯器? (如,更符合標準) – 2010-08-17 14:56:53

+0

@Mathieu:我已經使用了Watcom C++ 9.0-10.5,「觀察」了C++的更精細的細節,並且我用Comeau進行了一些測試 - 儘管從未在生產中。 VS的失控在這裏真的值得嗎? ---我缺少的關鍵洞察是'T :: SubType * p'會被解析爲算術表達式。 ---我沒有注意到我有一個C++標籤,但我確實知道C++每個月大概還是讓我感到驚訝。 – peterchen 2010-08-17 15:06:18

回答

4

關鍵字typename只是告訴編譯器,無論標識符如下是一個有效的類型。這在模板中很重要,因爲編譯器可能還沒有模板中使用的類型的定義,但您仍然希望能夠使用該類型定義的一部分(例如,如上面的key_type)。如果您沒有使用typename關鍵字,則編譯器會在該符號上出錯,因爲它不知道它是什麼。當您使用模板實例作爲模板參數時,這經常會發揮作用。

清澈如泥?

+0

+1 - 爲了(希望)在模板中澄清一點,如果你有Shape :: type,編譯器無法辨別type是否爲「類型」,或者它是Shape中的變量/枚舉。使用typename限定符允許您告訴編譯器這是一個「類型」。 – 2010-08-17 14:47:23

0

當您使用的類型依賴於其他事物時,您必須使用typename

在您的示例中,TMap::key_type依賴於模板參數,而TMap::key_type可能是函數標識符或變量名稱或其他任何內容......所以我們必須確保編譯器不是成員函數/變量。

另一方面,當我們使用的類型不依賴於另一個模板時,我們不需要將其指定爲typename

相關問題