Ошибка, когда буст-сигналы2 соединяются с привязкой void()

Когда я пытаюсь скомпилировать этот код, я получаю сообщение об ошибке

В конструкторе '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?

Вот код, чтобы "поиграть" с ним онлайн: http://cpp.sh/32ey

1 ответ

Решение

sig1 работает, потому что аргумент _1 Это относится к типу в boost Пространство имен. Это позволяет компилятору найти boost::bind через ADL, поскольку он находится в том же пространстве имен. Тем не менее, sig2 нет, так как ни один из аргументов не находится в boost Пространство имен.

Вам нужно будет либо сказать using namespace boost, using boost::bindили явно сделать вызов boost::bind решить вопрос.

Другие вопросы по тегам