Портируя приложение на 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'
Предупреждение об анахронизмах указывает на строку, содержащую спецификации шаблона для функции обтекания. Ошибка указывает на строку, где обратный вызов фактически вызывается и возвращается внутри функции переноса.
Это очень сбивает с толку, после прочтения я обнаружил, что анахронизмы - это своего рода атрибуты, используемые в API-интерфейсах Windows, которые я здесь не использую, и у меня также нет никакого __cdecl здесь. Я понятия не имею, как действовать здесь.