是否可以在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
的对象,则两个编译器都可以正常工作。
答案 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);