2012-02-21 48 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