2014-09-03 37 views
0

我有一個項目,其中boost :: signals2有問題。舉一個簡單的例子,我縮短了代碼以下三個類(所有的類都是簡體):boost :: signals2;沒有用於添加信號插槽的匹配功能

class SignalArgs 
{ 
    int a_number_; 
}; 

class Plugin 
{ 

    protected: 
     typedef boost::signals2::signal<void (SignalArgs& args)> Event; 
    public: 
     typedef Event::slot_type EventHandler; 



    public: 
     void addEventHandler(EventHandler& handler) 
     { 
      onEvent.connect(handler); 
     } 

    private: 
     Event onEvent; 
}; 

class PluginManager_ 
{ 
public: 
    PluginManager_() 
    { 
     p = new Plugin(); 
     // the error occurs in the following line 
     p->addEventHandler(boost::bind(&PluginManager_::plugin_event_handler, this, _1)); 
    } 
private: 
    Plugin* p; 

    void plugin_event_handler(SignalArgs& args); 
}; 

在編譯時,我總是得到錯誤 錯誤:調用「插件沒有匹配功能: :addEventHandler(boost :: _ bi :: bind_t,boost :: _ bi :: list2,boost :: arg < 1> >>)'

好吧,錯誤很簡單:編譯器沒有找到函數具有相同類型和數量的參數。我試圖通過定義一個確切類型爲Plugin::EventHandler(它本身是boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&的typedef)的對象來繞過這個問題,但沒有成功。

我有沒有監督過什麼?

+1

選項1的工作完美。謝謝! – Felix 2014-09-03 11:07:28

+1

@PiotrS。即使你認爲這不值得,也要小心地發表一個答案。在評論中發佈答案材料會誤導問題,就好像它沒有答案一樣,但它會阻止其他人回答,因爲......他們會「偷」你的評論...... – sehe 2014-09-03 12:53:00

+0

@PiotrS。對於我來說,沒有'std :: {bind,placeholders :: _ 1}'的差異。也許你正在使用MSVC並從它的擴展中受益,它允許臨時綁定到非const引用? – sehe 2014-09-03 13:38:59

回答

2

boost::bind返回一個臨時對象(一個綁定對象)。另外,轉換爲slot_type可能會導致另一個隱式轉換 - 導致另一個臨時轉換。

臨時變量只能(便攜)結合常數引用,這意味着應該將參數更改爲

void addEventHandler(EventHandler handler); 

void addEventHandler(EventHandler const& handler); 

在C++ 03代碼後者可能消除一個副本,而在C++ 11下,第一個將調用move-construction,因爲參數是一個右值。


相關問題