Я пытаюсь передать функцию моего класса void write_log(String verbosity, Variant message);
другому классу, который будет обрабатывать цикл обработки событий (ev.h). String и Variant взяты из пространства имен godot.
Я использовал typedef, чтобы преобразовать write_log в тип Logger, используя определение typedef void (godot::MQTT::*Logger)(godot::String, godot::Variant);
. Это определение хранится в вызываемом классе, а не в вызывающем классе.
Вызываемая функция определяется как void initialize(Logger logger);
, которая затем вызывается с помощью приведенного ниже кода.
libumqtt::Client client;
client.initialize(&MQTT::write_log);
Мой вызывающий класс — godot::MQTT
, а вызываемый класс — libumqtt::Client
.
Моя ошибка возникает, когда я пытаюсь использовать write_log.
void Client::initialize(Logger write_log) {
...
write_log("error", "Initializing MQTT Client!!! TypeDEF!!!");
...
}
Сообщение об ошибке, как показано ниже.
➜ Godot-MQTT-Module git:(master) ✗ scons platform=osx bits=64
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o src/MQTT.os -c -g -O2 -arch x86_64 -std=c++17 -fPIC -I. -Igodot-cpp/godot_headers -Igodot-cpp/include -Igodot-cpp/include/core -Igodot-cpp/include/gen -Isrc -Ilibraries/libumqtt/src src/MQTT.cpp
g++ -o src/client.os -c -g -O2 -arch x86_64 -std=c++17 -fPIC -I. -Igodot-cpp/godot_headers -Igodot-cpp/include -Igodot-cpp/include/core -Igodot-cpp/include/gen -Isrc -Ilibraries/libumqtt/src src/client.cpp
src/client.cpp:120:14: error: called object type 'libumqtt::Client::Logger' (aka 'void (godot::MQTT::*)(godot::String, godot::Variant)') is not a function or function pointer
write_log("error", "Initializing MQTT Client!!! TypeDEF!!!");
~~~~~~~~~^
1 error generated.
scons: *** [src/client.os] Error 1
scons: building terminated because of errors.
Я пытался понять, почему я не могу заставить компилятор распознать указатель на функцию, но пока мне не повезло. Я получил ошибки, такие как невозможность использовать косвенность и т. д., возясь с моим кодом.
Я также использовал эти ссылки, чтобы научиться использовать typedef и передавать указатель на функцию:
- Полное имя Typedef с указателями — http://www.radmangames.com/programming/how-to-use-function-pointers-in-cplusplus
- Использование против Typedef — https://www.internalpointers.com/post/differences-between-using-and-typedef-modern-c
- Typedef в заголовке - Как мне обратиться к typedef в заголовочном файле?
- Примеры определения типов — https://en.wikipedia.org/w/index.php?title=Typedef&oldid=923023181#Function_pointers
- Что такое Typedef — https://www.cprogramming.com/tutorial/typedef.html
- Передайте указатель функции - https://stackoverflow.com/a/9413/6828099
Изменить: при неинициализированном упоминании моего кода, выглядящего правильно, но количество опубликованных сообщений ограничено, я вставляю ссылки на классы и файлы заголовков из моего репо. Эти ссылки отмечены для этой конкретной фиксации, поэтому содержимое не изменится, даже когда я обновлю код. Кроме того, эта библиотека принадлежит Массачусетскому технологическому институту, поэтому вам не придется беспокоиться об авторских правах.
Редактировать 2: Используя этот ответ, я проверил тип переменной, которую я пытаюсь использовать write_log
в вызываемом классе, и это возвращает то, что я ожидал. Итак, я понятия не имею, почему компилятор не может видеть, что это функция. Я использую С++ 17 для компиляции своего кода, а С++ 14 имеет ту же проблему (С++ 11 прерывает другой код, даже не дойдя до этого, поэтому он не дает полезных результатов).
void (godot::MQTT::*)(godot::String, godot::Variant)