0

当我尝试编译此代码时,出现错误

在构造函数 'Foo::Foo()': 15:40: error: '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 吗?

这里是在线“玩”它的代码:http: //cpp.sh/32ey

4

1 回答 1

2

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

您将需要说using namespace boost,using boost::bind或明确调用boost::bind来解决问题。

于 2016-01-22T12:19:24.450 回答