我仍在尝试从MSVC迁移到GCC,但我似乎找不到解决以下问题的方法:
template < typename A, typename B, typename C, typename D >
class Test
{
public:
Test (B* pObj, C fn, const D& args) : _pObj(pObj), _fn(fn), _args(args)
{
}
A operator() ()
{
return _args.operator() < A, B, C > (_pObj, _fn); // error: expected primary-expression before ',' token
}
B* _pObj;
C _fn;
D _args;
};
请帮忙!
答案 0 :(得分:19)
试试return _args.template operator() < A, B, C > (_pObj, _fn);
。
如果没有template
关键字,则解析会有所不同。如果没有额外使用template
,编译器就不会知道后面的小于令牌(&lt;)并不是真正“小于”,而是模板参数列表的开头。
14.2 / 4
当成员模板专业化的名称出现之后。或 - &gt;在postfix-expression中,或者在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须是前缀为关键字模板。否则,假定该名称命名非模板。
P.S:阅读此Stackoverflow FAQ Entry