如何将boost :: signals2 :: signal连接到纯虚函数?

时间:2012-05-06 16:33:54

标签: c++ qt boost architecture signals

我在组件boost::signals2::signals中使用UpdateComponent。此组件的特定聚合类型为Updateable。我希望Updateable能够连接到UpdateComponent的{​​{1}}。我应该注意boost::signals2::signal的{​​{1}}是Updateable

以下是代码的具体示例:

slot

pure-virtual代码中的某个时刻,我执行了// 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的构造函数中,我执行以下操作:

// 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
  2. Updateable::Updateable { m_updateComponent = new UpdateComponent(); m_updateComponent->onUpdate.connect(&onUpdate); }
  3. 我应该提到我正在使用Qt和boost。但是,我已将...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]添加到我的/usr/include/boost/function/function_template.hpp:225: error: no match for call to '(boost::_mfi::mf1<void, BalaurEngine::Traits::Updateable, float>) (float&)'文件中,因此两者应该顺利合作,如boost网站所述。我不使用Qt CONFIG += no_keywords.pro(效果很好)的原因是:我不希望signals成为slots

    如果有人可以帮我弄清楚我收到错误的原因,我们将不胜感激!

1 个答案:

答案 0 :(得分:5)

您传递给connect的广告位必须是仿函数。要连接到成员函数,您可以使用boost::bind或C ++ 11 lambda。例如,使用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));
}