MSVC: неожиданный токен «__cdecl», ожидаемое «выражение» - PullRequest
0 голосов
/ 05 июля 2018

Портируя приложение на 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 здесь. Я понятия не имею, как действовать здесь.

1 Ответ

0 голосов
/ 05 июля 2018

Переименование CALLBACK в MEMFUNC сработало. Очевидно, Windows определяет CALLBACK для чего-то неожиданного, в результате чего код расширяется так, что он не компилируется.

Помимо того, что странно просто определять случайные вещи, подобные этой (без префикса WINDOWS_), к сожалению, компилятор генерирует ошибки, которые неправильно указывают на то, что он происходит в некотором #define, что затрудняет его отладку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...