通过GCC将带有模板化方法的类作为模板参数传递

时间:2018-07-17 10:14:10

标签: c++ function templates

是否可以在GCC下将带有模板化方法的类的对象作为模板参数传递?我进行的所有搜索都向我提出了有关模板化类的问题,这不适用于我的情况。

示例代码:

#include <iostream>

class Foo
{
public:
    template<typename T>
    void print(const T& arg) const
    {
        std::cout << arg << std::endl;
    }
};

template<typename A>
void print(const A& printer)
{
    printer.print<int>(1);
}

int main()
{
    Foo foo;
    print<Foo>(foo);
    return 0;
}

在MinGW.org GCC-6.3.0-1下进行编译,我得到以下结果:

tmpl.cpp: In function 'void print(const A&)':
tmpl.cpp:16:19: error: expected primary-expression before 'int'
     printer.print<int>(1);
                   ^~~
tmpl.cpp:16:19: error: expected ';' before 'int'

VisualStudio干净地编译相同的代码,应用程序按预期工作。如果我不对print函数进行模板化,则明确地将其作为Foo的对象,则两个编译器都可以正常工作。

2 个答案:

答案 0 :(得分:3)

您需要使用template关键字来说明print是模板。

  

在模板定义中,template可用于声明从属名称是模板。

例如

template<typename A>
void print(const A& printer)
{
    printer.template print<int>(1);
    //      ~~~~~~~~
}

print是一个从属名称,它取决于模板参数A。在实例化模板之前,编译器对A一无所知。因此,您需要添加template关键字来告诉编译器print是模板,然后在名称<之后的print是有效的;否则<将被视为operator<,然后导致错误。

答案 1 :(得分:3)

您需要template关键字才能指定print()是模板,例如:

printer.template print<int>(1);