c++ - 调用模板成员函数编译失败

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

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

http://codepad.org/ZR1Std4k

我收到以下错误:

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

最佳答案

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

c.template method1<TypeName1>();

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

关于c++ - 调用模板成员函数编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14811589/

相关文章:

c++ - 带有 const 模板参数的模板模板类

c++ - 如何专门化 const 和非 const 容器的模板?

c++ - 如何在不使用 make 文件的情况下运行 C 代理示例程序?

c++ - 挣扎着将新内容分配给 vector 的指针

c++ - vs2010中的extern模板类在源文件中具有显式实例化

c++ - 主构造函数中子类的初始化 - 主构造函数体与子类构造函数体

c++ - 使用 mingw 和 msys 编译带有 Python 绑定(bind)的 c++ 时出错

c++ - 使用模板的选择排序函数没有匹配的函数调用(C++)

c++ - 使用类中的列表列出 c++ 中的容器

c++ - 通过类的模板参数特化成员模板结构