2015-09-04 61 views
1

以下代碼在Visual Studio 2013下編譯,並且無法在gcc/clang(所有測試版本)下編譯。從屬模板使用Visual Studio編譯,但與clang/gcc失敗

鐺:error: use 'template' keyword to treat 'write' as a dependent template name

GCC:error: expected primary-expression before ‘int’

會出現這兩種錯誤在代碼

template <typename Itr>  
struct A {   
    template <typename Other>  
    void write(Other x) {}  
};  

template <class T>  
struct B {  
    A<T>& a;  
    B(A<T>& a) : a(a) {  
     // error: use 'template' keyword to treat 'write' as a dependent template name  
     a.write<int>(5);  
    }  
}; 

int main() {  
    A<int> a;  
    // Fine  
    a.write<int>(5);  
    B<int> b(a);  
} 

經驗告訴我,Visual Studio是可能是錯誤的指示,但我不知道爲什麼當完全指定A<T>時,這應該無法編譯,我只想調用一個我指定類型的模板方法。

+1

我看到這被標記爲重複的,是的,它在技術上是..但是當然你可以理解一個人如何設法做出這個錯誤,當你需要了解標準的非常技術性的措辭,使這種連接。同樣從這個問題的例子來看,現在還不清楚這是相關的。我個人認爲這是一個有用的問題,但無論如何。 – user3870920

+3

被標記爲重複的問題不是對問題的負面反映。這個問題非常好。只是它之前已經被問過了,關聯的問題對問題和解決方案有一個非常全面的解釋。複製品永遠活着可以用作路標。已關閉的問題被刪除。 – Barry

+0

@巴里啊,對!很高興知道,謝謝 – user3870920

回答

1

從[temp.names],重點煤礦:

當成員模板特的名字出現在一個後綴表達式.->嵌套名後-specifier in qualified-id and 後綴表達式的對象表達式是類型依賴的嵌套名稱說明符在合格-ID是指一種依賴型,但名稱不是 成員當前實例(14.6.2.1),該構件模板名稱必須其前綴爲關鍵字template。 否則,該名稱被假定爲命名一個非模板。

這裏,write是出現之後的後綴表達式一個.,並a類型相關(這取決於T)一個構件模板專業化,a不是的一個構件當前實例化(將是B<T>),所以它必須以template作爲前綴。海灣合作委員會和鏗鏘是正確的拒絕這個代碼,因爲它應該被視爲write是一個非模板和<是一個運算符 - 這是無效的。

+0

太好了,謝謝。我真的需要提高我的標準搜索技能。它只是我還是做了正確的版本,'a.template寫(5)'看起來令人難以置信...怪異? – user3870920

+0

@ user3870920就是這樣。 – Barry

+1

越來越多的C++越來越模糊工作。我的方法:保守地使用模板,堅持「與類c」 - C++ :) – BitTickler

相關問題