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

时间:2011-04-27 09:40:33

标签: c++ templates gcc

我仍在尝试从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;
};

请帮忙!

1 个答案:

答案 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