C++ 将函数指针插入QMap(Qt)

C++ 将函数指针插入QMap(Qt),c++,qt,function-pointers,qmap,C++,Qt,Function Pointers,Qmap,我正在Qt中为restapi创建一种路由器,并且在将函数指针插入QMap时遇到了问题 我有一个类IModule,其他模块都是从这个类派生出来的。 IModule.h的重要行包括 typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *); class IModule : public QObject { Q_OBJECT protected: QMap<QString , IBusAction > *m_

我正在Qt中为restapi创建一种路由器,并且在将函数指针插入QMap时遇到了问题

我有一个类
IModule
,其他模块都是从这个类派生出来的。
IModule.h
的重要行包括

typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);

class IModule : public QObject
{
   Q_OBJECT

  protected:
    QMap<QString , IBusAction > *m_actions;
因此,我尝试了两种方法,如何在QMap中使用引用符号(也不使用引用符号),但这两种方法都不起作用。我收到错误:
调用“QMap::insert(const char[5],QByteArray*(UserModule::*)(IBus*,ProxyRequest*)”时没有匹配的函数。

我花了几个小时研究这个问题,尝试了许多不同的方法来解决它,但都没有成功


因此,我非常乐意接受任何建议。

您的
IBusAction
是指向函数类型的指针。这与指向成员函数的指针不兼容

调用成员函数(如
UserModule::create
函数)时,它需要一个额外的(“不可见”)参数:函数被调用的实例(该
指针)

您基本上有三种选择:

  • IBusAction
    更改为指向-
    UserModule
    的成员函数的指针。不过,您只能使用该类的函数

    typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
    
  • 将函数设置为静态(这会更改代码的语义)

  • 使用独立函数(顶级,而不是类的成员)而不是成员函数

C++中的成员函数指针通常比它的值更麻烦。另一个合理的选择是使用类而不是方法,并保持指向实例的指针而不是方法


Qt特定的替代方法是使用基于QObject的类的可调用方法,您可以使用QObject::invokeMethod通过字符串名称调用该类,从而避免了许多类型问题。

由于UserModule是从IModule派生的,IModule也定义了函数show和create,但它们是虚拟的,所以我尝试了typedef QByteArray*(IModule:*IBusAction)(iBuS*,PROXIQUEST *);但它不工作,我不知道WHY。SRY我编辑了上面的注释,因为在写作过程中,我意外地按下了Enter也不会这样工作,对派生类的成员函数的指针与基类成员的指针不兼容。(您不能对基对象调用派生函数;但另一种方法也可以。)好的,这是个坏消息,但非常感谢您的帮助:)
typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);