1

QtでRESTAPI用のルーターのようなものを作成していますが、関数ポインターを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に配置する方法を2つ試しましたが、どちらも機能していません。エラーが発生しています: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ポインター)です。

基本的に3つのオプションがあります。

  • IBusActionメンバー関数のポインタになるように変更しますUserModule。ただし、これではそのクラスの関数に制限されます。

    typedef QByteArray* (UserModule::*IBusAction)(IBus * , ProxyRequest *);
    
  • 関数を作成しますstatic(これにより、コードのセマンティクスが変更されます)

  • メンバー関数の代わりに、独立した関数(クラスのメンバーではなく、トップレベル)を使用します。
于 2012-11-11T12:00:46.610 に答える
0

C ++のメンバー関数へのポインターは、一般的に、価値があるよりも面倒です。正気の代替手段は、メソッドの代わりにクラスを持ち、メソッドの代わりにインスタンスへのポインターを保持することです。

Qt固有の代替手段は、QObject :: invokeMethodを使用して文字列名で呼び出すことができる、QObjectベースのクラスの呼び出し可能なメソッドを使用し、多くの型の問題を回避することです。

于 2012-11-11T13:03:58.597 に答える