2012-05-06 12 views
2

コンポーネントにboost::signals2::signalsUpdateComponentを使用しています。このコンポーネントの特定の集合体は、タイプUpdateableです。私はUpdateableUpdateComponentboost::signals2::signalに接続できるようにしたいと思います。 Updateableslotpure-virtualです。以下純粋な仮想関数にboost :: signal2 ::信号を接続するには?

コードの具体例である:

// This is the component that emits a boost::signals2::signal. 
class UpdateComponent { 
    public: 
     UpdateComponent(); 
     boost::signals2::signal<void (float)> onUpdate; // boost::signals2::signal 
} 

UpdateComponentのコードのある時点で、私はonUpdate(myFloat)を行います。これは、すべての "リスナー"にboost::signals2::signalを "発射"するのと同じだと思います。 Updateableのコンストラクタで

// The is the aggregate that should listen to UpdateComponent's boost::signals2::signal 
class Updateable { 
    public: 
     Updateable(); 
    protected: 
     virtual void onUpdate(float deltaTime) = 0; // This is the pure-virtual slot that listens to UpdateComponent. 
     UpdateComponent* m_updateComponent; 
} 

、私は次の操作を行います

  1. ...Updateable.cpp:8: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&BalaurEngine::Traits::Updateable::onUpdate' [-fpermissive]
  2. /usr/include/boost/function/function_template.hpp:225: error: no match for call to '(boost::_mfi::mf1<void, BalaurEngine::Traits::Updateable, float>) (float&)'

Updateable::Updateable { 
    m_updateComponent = new UpdateComponent(); 
    m_updateComponent->onUpdate.connect(&onUpdate); 
} 

私は、次の2つのエラーを受け取ります

私はboostと組み合わせてQtを使っています。しかし、CONFIG += no_keywordsを私の.proファイルに追加しました。そのため、2つは、ブーストWebサイトで概説されているように、スムーズに連携する必要があります。私がQtのsignalsslots(これはうまくいきます)を使用しない理由は、UpdateableQObjectにしたくないからです。

誰かが私がなぜエラーになっているのか理解してもらえれば、非常に感謝しています!

+1

私はシグナルとスロットのためにブーストを使用していないので、私は具体的な例を与えることはできませんが、私は、問題があることを伝えることができます静的でないメンバ関数に接続しようとしているため、暗黙的にオブジェクトへのポインタをパラメータとして受け取ります。グーグル表示は、これを行う方法として 'boost :: bind'を使用することを示しています。 – tmpearce

+0

ありがとう、tmpearce。以下にirobotが言ったように、これが私の問題の原因です。 – Alex

答えて

5

connectに渡すスロットは、ファンクタでなければなりません。メンバ関数に接続するには、boost::bindまたはC++ 11 lambdaのいずれかを使用できます。

Updateable::Updateable { 
    m_updateComponent = new UpdateComponent(); 
    m_updateComponent->onUpdate.connect(
     [=](float deltaTime){ onUpdate(deltaTime); }); 
} 

または使用bind:たとえば、ラムダを使用して

Updateable::Updateable { 
    m_updateComponent = new UpdateComponent(); 
    m_updateComponent->onUpdate.connect(
     boost::bind(&Updateable::onUpdate, this, _1)); 
} 
+0

ありがとう、irobot。私はこれを知らなかった。 – Alex

+1

それはうまくいきましたが、それがあなたのやり方をうまくいけばうまくいったでしょう! – irobot

+0

はい、そうです!私は、QtのSIGNALSとSLOTSマクロ(似たような構文)に甘んじています。しかし、QtのSIGNALSとSLOTSを使うということは、QObjectから継承しなければならないということです。助けてくれてありがとう、irobot。 – Alex

関連する問題