2010-11-02 97 views
12

我試圖找到有關用作消除歧義器的模板關鍵字的任何信息,但沒有關於此的信息。可能我在搜索錯誤的關鍵字,但沒有像.template或 - >模板標準。谷歌只顯示來自不同論壇的海灣合作委員會問題,但沒有真正解釋它的用途。模板歧義消除器

這樣的代碼在第11行(GCC上)沒有模板關鍵字的情況下編譯失敗,但我不太確定這是否符合標準。

template<typename B> 
struct S1 
{ 
    template<typename T> void test() {} 
}; 

template<typename T> 
struct S2 
{ 
    S2() 
    { 
     S1<T>().template test<int>(); 
    } 
}; 

int main() 
{ 
    S2<int>(); 
} 

所以我的問題是:爲什麼這裏使用模板的關鍵字,什麼樣的模糊性是不存在該關鍵字,我在哪裏可以閱讀有關(我真的很感激鏈接到標準)。

謝謝。

+0

@Prasoon:我知道在哪裏使用'template'-keyword是很多問題的答案,但我找不到任何問題直接詢問它。 – 2010-11-02 11:26:20

+0

@ Space_C0wb0y:對不起,我刪除了我以前的評論。 – 2010-11-02 11:28:19

+0

您可能也想閱讀:http://stackoverflow.com/questions/3786360/confusing-template-error/3786726#3786726 – 2010-11-02 22:34:58

回答

8

簡短的回答:因爲標準是這樣說的

ISO C++ 03 14.2/4

當一個成員模板專業化的名稱後出現。或 - 在後綴表達式中,或者在限定id中的嵌套名稱說明符之後,並且postfix-expression或qualified-id顯式依賴於模板參數(14.6.2),則成員模板名稱必須是由關鍵字模板作爲前綴。 否則,該名稱被假定爲命名非模板

P.S:

沒有額外的使用模板,編譯器不知道後面的低於令牌(<)是不是真的「小於」,而是一個模板參數列表的開始。

+4

可能我需要改變我的PDF閱讀軟件:)在該文本之後有例子使用 - >模板,我的軟件找不到。非常感謝。這就對了。 – confucius 2010-11-02 11:33:44