当boost信号2与void()绑定

时间:2016-01-22 12:08:18

标签: c++ boost boost-signals2

当我尝试编译此代码时,我收到错误

  

在构造函数' Foo :: Foo()':15:40:错误:' bind'未被宣布   这个范围

#include <functional>
#include <boost/signals2.hpp>

class Foo {
public:
    Foo();
    void slot1(int i);
    void slot2();
    boost::signals2::signal<void (int)> sig1;
    boost::signals2::signal<void ()> sig2;
};
Foo::Foo() {
    sig1.connect(bind(&Foo::slot1, this, _1));  //  O K !
    sig2.connect(bind(&Foo::slot2, this));      //  E R R O R !
}
void Foo::slot1(int i) { }
void Foo::slot2() { }

int main() {
  Foo foo;
  foo.sig1(4711);
  foo.sig2();
}

让我感到恼火的是sig1.connect(...)有效但sig2.connect(...)无效。 如果我使用boost :: bind(),它也适用于sig2.connect(...)

sig2.connect(boost::bind(&Foo::slot2, this));        // O K !

有人可以解释为什么bind()适用于slot1而不适用于slot2?

这里的代码是&#34;播放&#34;在线使用:http://cpp.sh/32ey

1 个答案:

答案 0 :(得分:2)

sig1有效,因为参数boost是指boost::bind命名空间中的类型。这允许编译器通过ADL查找boost,因为它位于同一名称空间中。但是,sig2没有,因为没有任何参数在using namespace boost命名空间中。

您需要说using boost::bindboost::bind或明确拨打this.href来解决问题。