2016-01-22 27 views
0

當我嘗試編譯此代碼我得到錯誤錯誤時,升壓signals2爲void connect()的約束

In constructor 'Foo::Foo()': 15:40: error: 'bind' was not declared in this scope

#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

回答

2

SIG1工作,因爲參數_1是指在boost命名空間的類型。這允許編譯器通過ADL找到boost::bind,因爲它位於相同的名稱空間中。但是,sig2不會,因爲boost名稱空間中沒有任何參數。

您需要說using namespace boostusing boost::bind或明確撥打boost::bind來解決問題。

+0

感謝您的解釋 –