C++ MSVC:意外的令牌'__cdecl';,预期';表达式';

C++ MSVC:意外的令牌'__cdecl';,预期';表达式';,c++,visual-studio-2017,C++,Visual Studio 2017,将一个应用程序移植到Windows,我现在正试图用VS2017编译它,遇到了很多问题。其中一个是我编写的一个模板包装器,用来让一个C++成员函数从C库(FISH)调用,不起作用: template <class T> class Callback {}; template <class T, class ...Arguments> struct Callback<T(Arguments...)> { template <T(operations

将一个应用程序移植到Windows,我现在正试图用VS2017编译它,遇到了很多问题。其中一个是我编写的一个模板包装器,用来让一个C++成员函数从C库(FISH)调用,不起作用:
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)...);
    }
};
模板类回调{};
模板
结构回调
{
模板
静态T换行(参数…参数)
{
auto*instance=static\u cast(fuse\u get\u context()->private\u data);
返回(实例->*回调)(标准::转发(参数)…);
}
};
我试图在构造函数中设置如下回调:

_operations.get_attr = Callback<std::remove_reference<decltype(*_high_level.getattr)>::type>::wrap<&operations::getattr>;
\u operations.get\u attr=Callback::wrap;
我相信这是一段有效的代码,但并没有出现一些警告和错误:

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'
警告C4229:使用了时间错误:忽略数据上的修饰符
错误C2760:语法错误:意外标记“\uuu cdecl”,应为“表达式”
注意:请参阅正在编译的函数模板实例化“T Callback::wrap(const char*,stat64_cygwin*)”的参考
具有
[
T=int
]
注意:请参阅正在编译的函数模板实例化“T Callback::wrap(const char*,stat64_cygwin*)”的参考
具有
[
T=int
]
错误C2059:语法错误:'\uu cdecl'
关于时间错误的警告指向包含wrap函数模板规范的行。错误指向wrap函数中实际调用和返回回调的行


这是非常令人困惑的,在阅读了一些内容后,我发现错时是Windows API中使用的一种属性,我在这里没有使用,我在这里也没有任何cdecl。我不知道如何在这里继续。

将回调重命名为MEMFUNC有效。很明显,Windows定义了对意外事件的回调,导致代码以不可编译的方式展开


除了定义这样的随机内容(不使用WINDOWS#作为前缀)很奇怪之外,不幸的是,编译器生成的错误没有正确地表明它起源于某些#define,这使得调试很困难。

“我这里也没有任何#cdecl”-几乎可以肯定是回调宏。你能找到它的定义吗?除了cdecl,它还有什么别的吗?从C++中调用C++函数(模板)吗?奇怪。什么是
CALLBACK
?CALLBACK是保存要调用的函数指针的模板参数。它不是一个宏-除非Windows出于某种神秘的原因将其定义为宏。是的,在其中一个Windows标题中有一个
\define CALLBACK FAR PASCAL
,尽管它在一个#ifdef中,我不希望您会点击它。(帕斯卡不是CDECL。)我猜你正在点击一个,你必须选择一个不同的标识符。。。。欢迎使用Windows开发--希望您喜欢与宏冲突;)