[英]Insert function pointer into QMap (Qt)
我正在為 Qt 中的 REST API 創建某種路由器,但在將函數指針插入 QMap 時遇到了問題。
我有派生其他模塊的IModule
類。 IModule.h
重要行是
typedef QByteArray* (*IBusAction)(IBus * , ProxyRequest *);
class IModule : public QObject
{
Q_OBJECT
protected:
QMap<QString , IBusAction > *m_actions;
然后我有從IModule
派生的UserModule
,在.cpp
文件中我有以下UserModule
行:
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*))'
我花了幾個小時解決這個問題,嘗試了很多不同的方法來解決它,但沒有成功。
所以我會很高興得到任何建議。
您的IBusAction
是指向函數的指針類型。 這與指向成員函數的指針不兼容。
當你調用一個成員函數(比如你的UserModule::create
函數)時,它需要一個額外的(“不可見”)參數:函數被調用的實例( this
指針)。
您基本上有三個選擇:
將IBusAction
更改為IBusAction
成員函數的UserModule
。 盡管如此,您只能使用該類的功能。
typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
使函數static
(這會更改代碼的語義)
在 C++ 中指向成員函數的指針通常比它的價值更麻煩。 明智的選擇是使用類而不是方法,並保留指向實例的指針而不是方法。
Qt 特定的替代方法是使用基於 QObject 的類的可調用方法,您可以通過字符串名稱調用它,使用 QObject::invokeMethod,繞過許多類型問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.