【问题标题】:Call to template member function failing to compile调用模板成员函数编译失败
【发布时间】:2013-01-26 12:31:52
【问题描述】:

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

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-errors。

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

c.method1<TypeName1>();

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    当您调用成员函数模板并且您有一个依赖名称时,您应该使用template 关键字,否则method1 将被解析为c 和&lt; 的成员变量为“小于" 符号:

    c.template method1<TypeName1>();
    

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

    【讨论】:

    • 好答案。可怕的语言。
    • +1。特别是在这种情况下,即使Class1 是前向声明的,也不能假定Class1&lt;TypeName2&gt;::method1 是一个模板函数。 Class1 在其他地方的模板特化可以证明并非如此。
    • @AndreasBrinck:很高兴它有帮助:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多