我遇到以下形式的代码问题:
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上使用编译器编译时:
我收到以下错误:
t.cpp:在成员函数&#39; int Class2 :: method2()&#39;:第15行:错误: 在&#39;&gt;&#39;之前预期的初级表达令牌编译终止 由于-Wfatal-errors。
违规行是模板成员函数的调用:
c.method1<TypeName1>();
答案 0 :(得分:11)
在调用成员函数模板时,您应该使用template
关键字并且您具有从属名称,或者method1
将被解析为c
和{{的成员变量1}}作为“小于”符号:
<
正如@DrewDormann正确指出的那样,需要c.template method1<TypeName1>();
关键字的原因是template
类模板的特化可能存在于所提供的特定类型参数中,其中Class1
被定义为成员变量而不是函数模板。因此,如果不是这种情况,必须明确指示编译器将method1
解析为函数模板的名称。