Я создаю своего рода маршрутизатор для REST API в Qt, и я сталкиваюсь с проблемой вставки указателя функции в QMap.
у меня урок IModule
из которого получены другие модули.
Важные черты IModule.h
являются
typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);
class IModule : public QObject
{
Q_OBJECT
protected:
QMap<QString , IBusAction > *m_actions;
Тогда у меня есть UserModule
который получен из IModule
И в .cpp
файл у меня есть такие строки:
QByteArray* UserModule::create(IBus *bus, ProxyRequest *req)
{
}
QByteArray* UserModule::show( IBus *bus, ProxyRequest *req)
{
}UserModule::UserModule(QObject *parent) :
IModule(parent)
{
// register functions
m_actions->insert("show", &UserModule::show);
m_actions->insert("create", UserModule::create);
}
Итак, я попробовал два варианта, как поместить функцию в QMap со ссылочным знаком также без нее, но оба не работают. Я получаю ошибку: no matching function for call to 'QMap<QString, QByteArray* (*)(IBus*, ProxyRequest*)>::insert(const char [5], QByteArray* (UserModule::*)(IBus*, ProxyRequest*))'
Я провел несколько часов с этой проблемой, пробовал много разных способов ее решения, но успеха не было.
Поэтому я буду очень рад за любой совет.
Ваш IBusAction
тип указателя на функцию Это несовместимо с функцией указателя на член.
Когда вы вызываете функцию-член (например, ваш UserModule::create
функция), ему нужен дополнительный («невидимый») параметр: экземпляр, на который вызывается функция ( this
указатель).
У вас есть три основных варианта:
+ Изменить IBusAction
быть указателем на член-функцию-из-UserModule
, Вы ограничены функциями этого класса с этим, хотя.
typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
Сделать функции static
(это меняет семантику вашего кода)
Указатели на функции-члены в C ++, как правило, доставляют больше хлопот, чем они того стоят. Разумная альтернатива — иметь класс вместо метода и хранить указатель на экземпляр вместо метода.
Специфичной альтернативой Qt является использование вызываемых методов класса, основанного на QObject, который вы можете вызывать по имени строки, используя QObject :: invokeMethod, обходя многие проблемы типов.