调用模板成员函数无法编译

时间:2013-02-11 12:11:42

标签: c++ templates

我遇到以下形式的代码问题:

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();
}

在codepad上使用编译器编译时:

http://codepad.org/ZR1Std4k

我收到以下错误:

  

t.cpp:在成员函数&#39; int Class2 :: method2()&#39;:第15行:错误:   在&#39;&gt;&#39;之前预期的初级表达令牌编译终止   由于-Wfatal-errors。

违规行是模板成员函数的调用:

c.method1<TypeName1>();

1 个答案:

答案 0 :(得分:11)

在调用成员函数模板时,您应该使用template关键字并且您具有从属名称,或者method1将被解析为c和{{的成员变量1}}作为“小于”符号:

<

正如@DrewDormann正确指出的那样,需要c.template method1<TypeName1>(); 关键字的原因是template类模板的特化可能存在于所提供的特定类型参数中,其中Class1被定义为成员变量而不是函数模板。因此,如果不是这种情况,必须明确指示编译器将method1解析为函数模板的名称。