I am creating sort of a router for REST API in Qt and I am facing problem with inserting the function pointer into the QMap.
I have class IModule from which the other modules are derivated.
Important lines of IModule.h are
typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);
class IModule : public QObject
{
Q_OBJECT
protected:
QMap<QString , IBusAction > *m_actions;
Then I have UserModule which is derived from IModule and in .cpp file I have these lines:
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);
}
So I tried two options how to put the function in QMap with referencing sign also without it, but both are not working. I am getting error: no matching function for call to 'QMap<QString, QByteArray* (*)(IBus*, ProxyRequest*)>::insert(const char [5], QByteArray* (UserModule::*)(IBus*, ProxyRequest*))'
I have spent several hours with this problem, tried many different things how to solve it but there was no success.
So I will be very glad for any piece of advice.
Your
IBusActionis a pointer-to-function type. This is not compatible with pointer-to-member function.When you call a member function (like your
UserModule::createfunction), it needs an extra (“invisible”) parameter: the instance the function gets called on (thethispointer).You have essentially three options:
Change
IBusActionto be a pointer-to-member-function-of-UserModule. You’re restricted to that class’s functions with this though.Make the functions
static(this changes the semantics of your code)