奇怪的 GCC 错误:预期在 ',' 之前有主表达式代币

发布于 2024-11-03 17:44:59 字数 456 浏览 0 评论 0原文

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

请帮忙!

I'm still trying to migrate from MSVC to GCC, but I can't seem to find a solution to the following problem:

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;
};

Please help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

海拔太高太耀眼 2024-11-10 17:44:59

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

如果没有 template 关键字,解析将会有所不同。如果没有额外使用 template,编译器不知道后面的小于标记 (<) 并不是真正的“小于”,而是模板参数列表的开头。

14.2/4

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

PS:阅读此 Stackoverflow 常见问题解答条目

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

Without the template keyword the parse would be different. Without that extra use of template, the compiler does not know that the less-than token (<) that follows is not really "less than" but the beginning of a template argument list.

14.2/4

When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

P.S: Read this Stackoverflow FAQ Entry

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文