5

我对以下形式的一段代码有疑问:

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

在键盘上使用编译器编译时:

http://codepad.org/ZR1Std4k

我收到以下错误:

t.cpp:在成员函数“int Class2::method2()”中:第 15 行:错误:“>”标记编译之前的预期主表达式由于 -Wfatal 错误而终止。

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

c.method1<TypeName1>();
4

1 回答 1

11

template当您调用成员函数模板并且您有一个依赖名称时,您应该使用关键字,或者method1将被解析为成员变量c<“小于”符号:

c.template method1<TypeName1>();

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

于 2013-02-11T12:14:45.293 回答