2013-02-11 149 views
5

我有一張以下形式的代碼問題:呼叫到模板成員函數未能編譯

http://codepad.org/ZR1Std4k

我得到:

template<class Type> 
class Class1 { 
public: 
    template<class TypeName1> TypeName1* method1() const {return 0;} 
}; 

struct Type1{}; 
struct Type2{}; 

class Class2 { 
public: 
    template<typename TypeName1, typename TypeName2> 
    int method2() { 
     Class1<TypeName2> c; 
     c.method1<TypeName1>(); 
     return 0; 
    } 

    int method1() { 
     return method2<Type1, Type2>(); 
    } 
}; 

int 
main() { 
    Class2 c; 
    return c.method1(); 
} 

當鍵盤,提供編譯器編譯出現以下錯誤:

t.cpp: In member function 'int Class2::method2()': Line 15: error: expected primary-expression before '>' token compilation terminated due to -Wfatal-errors.

違規行是調用模板成員函數:

c.method1<TypeName1>(); 

回答

11

您應該使用,當你調用一個成員函數模板template關鍵字,你有一個從屬名稱,或method1將被解析爲c<一個成員變量爲「少比」符號:

c.template method1<TypeName1>(); 

由於@DrewDormann正確地指出,爲什麼需要template關鍵字的原因是Class1類模板的專業化可以爲特定類型的參數存在提供,其中method1被定義爲成員變量而不是函數模板。因此,如果不是這種情況,必須明確指示編譯器將method1解析爲函數模板的名稱。

+0

很好的答案。可怕的語言。 – 2013-02-11 12:19:07

+0

工作就像一個魅力,將在5分鐘內接受! – 2013-02-11 12:20:53

+2

+1。特別是在這種情況下,即使'Class1'是前向聲明的,也不能認爲'Class1 :: method1'是模板函數。其他地方的'Class1'的模板專門化可以證明。 – 2013-02-11 12:22:13