Search code examples
c++qtfunction-pointersqmap

Insert function pointer into QMap (Qt)


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.


Solution

  • Your IBusAction is a pointer-to-function type. This is not compatible with pointer-to-member function.

    When you call a member function (like your UserModule::create function), it needs an extra ("invisible") parameter: the instance the function gets called on (the this pointer).

    You have essentially three options:

    • Change IBusAction to be a pointer-to-member-function-of-UserModule. You're restricted to that class's functions with this though.

      typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
      
    • Make the functions static (this changes the semantics of your code)

    • Use free-standing functions (top-level, not members of a class) instead of member functions.