2012-10-01 122 views
23

可能重複:
C++ template member function of template class called from template function如何調用模板成員函數?

template<class T1> 
class A 
{ 
public: 
    template<class T0> 
    void foo() const {} 
}; 

template<class T0,class T1> 
void bar(const A<T1>& b) 
{ 
    b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token" 
} 

我可以把它改成

b->A<T1>::template foo<T0>(); 

它編譯罰款。不過我也可以把它改成

b.A<T1>::template foo<T0>(); 

它也編譯得很好。是嗎?

如何在原始代碼的意義上正確調用模板成員函數?

+0

難道我們知道這兩種說法有什麼實際編制是什麼意思?在這個「熟化」的例子中,他們編譯,但在我真正的程序中,這不能編譯。 – ritter

回答

37

剛剛發現它:

根據C++'03標準14.2/4:

當成員模板特的名稱將出現在一個後綴表達式.->之後,或後嵌套名稱說明符在限定id中,postfix-expression或qualified-id顯式依賴於模板參數(14.6.2),成員模板名稱必須以關鍵字template爲前綴。否則,該名稱被假定爲命名一個非模板。

正確的代碼是:

b.template foo<T0>(); 
+1

這是出於同樣的原因和條件類似於'typename'是必要的。 – bames53

10

你可以調用該函數是這樣的:

b.template foo<T0>(); 
相關問題