MSVC:意外令牌'__cdecl',预期'表达式'

时间:2018-07-05 09:09:08

标签: c++ visual-studio-2017

将应用程序移植到Windows时,我现在正尝试使用VS2017进行编译,并且遇到了很多问题。其中之一是我编写的模板包装程序无法使C ++成员函数可从C库(FUSE)调用:

template <class T> class Callback {};

template <class T, class ...Arguments>
struct Callback<T(Arguments...)>
{
    template <T(operations::*CALLBACK)(Arguments...)>
    static T wrap(Arguments... parameters)
    {
        auto *instance = static_cast<operations*>(fuse_get_context()->private_data);
        return (instance->*CALLBACK)(std::forward<Arguments>(parameters)...);
    }
};

我试图在构造函数中设置这样的回调:

_operations.get_attr = Callback<std::remove_reference<decltype(*_high_level.getattr)>::type>::wrap<&operations::getattr>;

-我相信-这是有效的代码,但是它与某些警告和错误不兼容:

warning C4229: anachronism used: modifiers on data are ignored
error C2760: syntax error: unexpected token '__cdecl', expected 'expression'
note: see reference to function template instantiation 'T Callback<int (const char *,stat64_cygwin *)>::wrap<int operations::getattr(const char *,stat64_cygwin *)>(const char *,stat64_cygwin *)' being compiled
        with
        [
            T=int
        ]
note: see reference to function template instantiation 'T Callback<int (const char *,stat64_cygwin *)>::wrap<int operations::getattr(const char *,stat64_cygwin *)>(const char *,stat64_cygwin *)' being compiled
        with
        [
            T=int
        ]
error C2059: syntax error: '__cdecl'

关于过时的警告指向包含自动换行功能的模板规范的行。错误指向wrap函数中实际调用并返回回调的行。

这很令人困惑,在阅读了一些内容之后,我发现过时是Windows API中使用的排序属性,我在这里不使用它,这里也没有__cdecl。我不知道该如何进行。

1 个答案:

答案 0 :(得分:1)

将CALLBACK重命名为MEMFUNC起作用。显然,Windows将CALLBACK定义为意外内容,从而导致代码以无法编译的方式扩​​展。

除了仅定义这样的随机变量(不带WINDOWS_前缀)是很奇怪的事实,不幸的是,编译器会生成错误,无法正确地指出它源自某个#define,从而使其难以调试。