1

我正在为 Qt 中的 REST API 创建某种路由器,并且在将函数指针插入 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*))'

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

所以我会很高兴收到任何建议。

4

2 回答 2

2

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

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

您基本上有三个选择:

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

    typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
    
  • 制作函数static(这会改变代码的语义)

  • 使用独立函数(顶层,不是类的成员)而不是成员函数。
于 2012-11-11T12:00:46.610 回答
0

C++ 中指向成员函数的指针通常比它的价值更麻烦。理智的替代方法是使用类而不是方法,并保留指向实例的指针而不是方法。

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

于 2012-11-11T13:03:58.597 回答