2011-02-09 47 views
68

我不明白,在我看來,f的調用是完全無歧義的,但它無法與expected primary-expression before ‘int’編譯。如果我通過f的呼叫註釋掉該行,它編譯得很好。爲什麼我嘗試使用顯式類型參數調用模板成員函數時出錯?

template<typename T> 
struct A { 
    template<typename S> 
    void f() { } 
}; 

template<typename T> 
struct B : A<T> { 
    void g() { 
     this->f<int>(); 
    } 
}; 
+29

我讚賞你不僅發現這個邪惡的問題,而且在描述它時從不發誓。 – 2011-02-09 10:15:03

回答

129

這是由於標準的一個非常模糊的條款中,如果您有任何試圖在一個對象,其類型依賴於一個模板參數來訪問模板函數模板,你必須使用template關鍵字在一個奇怪的方式:

this->template f<int>(); 

這類似於與typename與從屬類型的出現,除了應用於函數古怪。特別是,如果你離開了template關鍵字,有

​​

(你打算什麼),以及

((this->f) < int) >() 

這是沒有意義的(因此你的錯誤)之間的解析歧義。在這裏使用關鍵字template可以消除歧義,並強制編譯器認識到它正在查看對模板成員函數的完全有效的調用,而不是亂碼的大量符號。

希望這會有所幫助!

+2

我已經知道模板的一些語法古怪,但我從來沒有聽說過這個。 – Gorpik 2011-02-09 08:50:42

相關問題