0

boost::signals2 に問題があるプロジェクトがあります。簡単な例を示すために、コードを次の 3 つのクラスに短縮しました (すべてのクラスが簡略化されています)。

class SignalArgs
{
    int a_number_;
};

class Plugin
{

    protected:
        typedef boost::signals2::signal<void (SignalArgs& args)> Event;
    public:
        typedef Event::slot_type EventHandler;



    public:
        void addEventHandler(EventHandler& handler)
        {
            onEvent.connect(handler);
        }

    private:
        Event onEvent;
};

class PluginManager_
{
public:
    PluginManager_()
    {
        p = new Plugin();
        // the error occurs in the following line
        p->addEventHandler(boost::bind(&PluginManager_::plugin_event_handler, this, _1)); 
    }
private:
    Plugin* p;

    void plugin_event_handler(SignalArgs& args);
};

コンパイル中に、常に次のエラーが表示 されます: 'Plugin::addEventHandler(boost::_bi::bind_t, boost::_bi::list2, boost::arg<1> > >)' の呼び出しに一致する関数はありません

さて、エラーは単純です: コンパイラは、同じ型とパラメータの数を持つ関数を見つけられませんでした. 正確なタイプのオブジェクトを定義してそれをバイパスしようとしましたがPlugin::EventHandler(それ自体は typedef ですboost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&)、成功しませんでした。

私は何かを監督しましたか?

4

1 に答える 1

2

boost::bind一時 (バインド オブジェクト) を返します。さらに、 への変換により、slot_type別の暗黙的な変換が発生する可能性が高くなり、さらに別の一時的な結果が生じます。

一時変数は const-references にのみ (移植可能に) バインドできます。つまり、引数を次のいずれかに変更する必要があります。

    void addEventHandler(EventHandler handler);

また

    void addEventHandler(EventHandler const& handler);

C++03 コードでは、後者はコピーを削除する可能性がありますが、C++11 では、パラメーターが右辺値であるため、最初のコードは move-construction を呼び出します。


于 2014-09-03T13:41:58.427 に答える