【问题标题】:Strange GCC error: expected primary-expression before ',' token奇怪的 GCC 错误:“,”标记之前的预期主表达式
【发布时间】:2011-04-27 09:40:32
【问题描述】:

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

请帮忙!

【问题讨论】:

    标签: c++ templates gcc


    【解决方案1】:

    试试return _args.template operator() &lt; A, B, C &gt; (_pObj, _fn);

    如果没有 template 关键字,解析会有所不同。如果没有额外使用 template,编译器就不会知道后面的小于标记 (

    14.2/4

    当成员模板特化的名称出现在 .或 -> 在后缀表达式中,或在限定 ID 中的嵌套名称说明符之后,并且后缀表达式或限定 ID 显式依赖于模板参数 (14.6.2),成员模板名称必须以关键字模板为前缀。否则,该名称被假定为命名一个非模板。

    P.S:阅读此Stackoverflow FAQ Entry

    【讨论】:

    • 非常感谢!我知道模板关键字,但我从没想过在方法声明中使用它......现在我明白了,谢谢!
    • 也感谢我,我完全忘记了这件事。这解决了我遇到的类似问题!赞成。
    猜你喜欢
    • 2021-10-11
    • 2018-06-28
    • 2013-01-13
    • 2017-09-24
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多