我在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*))'
我花了几个小时解决这个问题,尝试了很多不同的方法如何解决它但没有成功。
所以我会很乐意接受任何建议。
答案 0 :(得分:2)
您的IBusAction
是指针到函数类型。这与指向成员的函数不兼容。
当你调用一个成员函数(比如你的UserModule::create
函数)时,它需要一个额外的(“不可见”)参数:调用函数的实例(this
指针)。
您基本上有三种选择:
将IBusAction
更改为指向成员的指针功能 - UserModule
。尽管如此,你只能使用这个类的功能。
typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
创建函数static
(这会更改代码的语义)
答案 1 :(得分:0)
使用C ++中的成员函数指针通常比它的价值更麻烦。 Sane的替代方法是使用类而不是方法,并将指针保持为实例而不是方法。
Qt特定的替代方法是使用基于QObject的类的可调用方法,您可以使用QObject :: invokeMethod通过字符串名称调用,侧面执行许多类型问题。