2013-04-11 20 views
1

考慮這個例子:如何解決boost :: signals2的slot_type和boost :: bind的歧義,爲什麼它甚至含糊不清?

#include <boost/signals2/signal.hpp> 
#include <boost/bind.hpp> 

typedef boost::signals2::signal< void (double) > DoubleSignalType; 
typedef boost::signals2::signal< void (void) > VoidSignalType; 

class B { 
public: 
    void connect(DoubleSignalType::slot_type dbl_slot) { 
     dbl_sig.connect(dbl_slot); 
    } 

    void connect(VoidSignalType::slot_type void_slot) { 
     void_sig.connect(void_slot); 
    } 
private: 
    DoubleSignalType dbl_sig; 
    VoidSignalType void_sig; 
}; 

class A { 
public: 
    void foo(double a) {}; 
    void bar(void) {}; 
    void other(){ 
     B b; 
     b.connect(boost::bind(&A::foo, this, _1)); 
    } 
}; 

int main(int argc, char* argv[]) { return 0; } 

當我編譯此,我得到:

g++ x.cpp 
x.cpp: In member function ‘void A::other()’: 
x.cpp:27:53: error: call of overloaded ‘connect(boost::_bi::bind_t<void, boost::_mfi::mf1<void, A, double>, boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > >)’ is ambiguous 
x.cpp:27:53: note: candidates are: 
x.cpp:9:10: note: void B::connect(boost::signals2::signal1<void, double, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void(double)>, boost::function<void(const boost::signals2::connection&, double)>, boost::signals2::mutex>::slot_type) 
x.cpp:13:10: note: void B::connect(boost::signals2::signal0<void, boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void()>, boost::function<void(const boost::signals2::connection&)>, boost::signals2::mutex>::slot_type) 

有沒有解決辦法?

回答

2

你必須做一些更復雜,因爲boost::bindoperator()爲模板,並有參數的任意數字(要能調用函數不帶參數,因爲它有一些)。

如果您提供非overaloaded方法,一切都將是確定

+0

我接受了這個解決方案,雖然Mark的解決方案也不錯,但我決定將它用作用戶端的接口('connect'-function)更易於使用,並且重命名成員函數實際上對我的應用程序有幫助,因爲我不得不區分枚舉參數的功能。但馬克也是+1。謝謝你們。 – math 2013-04-15 07:07:12

2

一個簡單的解決方案是顯式創建所需的信號類型。即:

b.connect(DoubleSignalType::slot_type(boost::bind(&A::foo, this, _1))); 
+0

我覺得不要用重載會更simplier =) – kassak 2013-04-11 09:28:39

+0

@kassak在過去,我按照您的方法 - 提供露骨的功能,而不是重載。 – mark 2013-04-11 09:53:47

相關問題