奇怪的GCC错误:在','标记之前预期的主要表达式

Rya*_*yan 7 c++ gcc templates

我仍然在试图从迁移到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;
};
Run Code Online (Sandbox Code Playgroud)

请帮忙!

Pra*_*rav 21

试试return _args.template operator() < A, B, C > (_pObj, _fn);.

没有template关键字,解析就会有所不同.如果没有额外使用template,编译器不会知道后面的小于令牌(<)实际上并不是"小于",而是模板参数列表的开头.

14.2/4

当成员模板专业化的名称出现之后.或 - >在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须是以关键字模板为前缀.否则,假定该名称命名非模板.

PS:阅读此Stackoverflow FAQ条目