2012-02-21 4 views
2

Учитывая следующий классповышение :: связать композицию внутри 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 "в bind.hpp Я выясняю, что проблема должна быть внутри функции io_post, аргумент которой представляет собой состав двух разных объектов boost :: bind. Но я не смог глубоко понять настоящую проблему.

+0

Что такое определение 'message_receiver :: handle_msg'? – ildjarn

+0

Привет, Это метод с этой сигнатурой: 'void message_receiver :: handle_msg (const qpid :: client :: Message & msg)' – fremmi

ответ

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