将应用程序移植到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。我不知道该如何进行。
答案 0 :(得分:1)
将CALLBACK重命名为MEMFUNC起作用。显然,Windows将CALLBACK定义为意外内容,从而导致代码以无法编译的方式扩展。
除了仅定义这样的随机变量(不带WINDOWS_前缀)是很奇怪的事实,不幸的是,编译器会生成错误,无法正确地指出它源自某个#define,从而使其难以调试。