2012-02-21 33 views
2

考慮下面的類的boost :: io_service對象::後函數內綁定組成

class task_counter                                   
{                                        
     public:                                      
       task_counter(short, boost::asio::io_service&);                          
       ~task_counter(void);                                 


     template<typename CompletionHandler>                             
     void exec_task(CompletionHandler handler)                            
     {                                      
       grant_access();                                
       io_.post(boost::bind(&task_counter::exec_and_decrease_counter<CompletionHandler>, this, handler));           
     }                                      

     template<typename CompletionHandler>                             
     void exec_and_decrease_counter(CompletionHandler handler)                       
     {                                      
       handler();                                 
       decrease_counter();                               
     }                                      

    private: 
      .... 
} 

方法exec_task稱爲基於這樣其他類:

tc_msg->exec_task(boost::bind(&message_receiver::handle_msg, this, msg)); 

編譯失敗,指出「無效使用void expression「in bind.hpp 我發現問題應該在io_post函數中,它的參數是由兩個不同的boost :: bind對象組成的。但我無法深入解決真正的問題。

+0

什麼是'message_receiver :: handle_msg'的定義是什麼? – ildjarn 2012-02-21 18:00:49

+0

嗨,這是一個有這個簽名的方法:'void message_receiver :: handle_msg(const qpid :: client :: Message&msg)' – fremmi 2012-02-21 18:06:42

回答

3

相反的:

io_.post(boost::bind(&task_counter::exec_and_decrease_counter<CompletionHandler>, this, handler)); 

嘗試以下操作:

#include <boost/bind/protect.hpp> 
//... 

io_.post(boost::bind(&task_counter::exec_and_decrease_counter<boost::_bi::protected_bind_t<CompletionHandler> >, this, boost::protect(handler))); 
+0

太棒了! 非常感謝 – fremmi 2012-02-23 14:15:26

相關問題