2011-08-31 27 views
1

因此,我所有的工作都發生在名爲thread_pool的班級中。此代碼將工作無論run_item需要什麼到本身:Boost綁定內部提升packaged_task。爲什麼要提升asio認爲它不是CompletionHandler?

template <class task_return_t> 
    void thread_pool::pool_item(boost::shared_ptr< boost::packaged_task<task_return_t> > pt) 
    { 
     internal_tasks.post(boost::bind(&thread_pool::run_item<task_return_t>, this, pt)); 
//... 

這不會編譯:

template <class task_return_t> 
    void thread_pool::pool_item(boost::shared_ptr< boost::packaged_task<task_return_t> > pt) 
    { 
     boost::packaged_task<void> task (boost::bind(&thread_pool::run_item<task_return_t>, this, pt))); 
     internal_tasks.post(task); 

爲什麼?以及如何使它編譯?

我使用boost 1.47.0。錯誤我的VS2010 talls我:

Error 6 error C2665: 'boost::asio::detail::zero_arg_handler_test' : none of the 2 overloads could convert all the argument types C:\Program Files (x86)\Boost-1.47.0\include\boost\asio\impl\io_service.hpp 88 1 cf-server 

Error 9 error C2664: 'void boost::asio::detail::task_io_service::post<CompletionHandler>(Handler)' : cannot convert parameter 1 from 'const boost::packaged_task<R>' to 'boost::packaged_task<R>' C:\Program Files (x86)\Boost-1.47.0\include\boost\asio\impl\io_service.hpp 90 1 cf-server 

Error 8 error C2664: 'T &boost::asio::detail::lvref<CompletionHandler>(T)' : cannot convert parameter 1 from 'const boost::packaged_task<R>' to 'boost::packaged_task<R>' C:\Program Files (x86)\Boost-1.47.0\include\boost\asio\impl\io_service.hpp 88 1 cf-server 

Error 7 error C2664: 'boost::asio::detail::clvref' : cannot convert parameter 1 from 'const boost::packaged_task<R>' to 'boost::packaged_task<R>' C:\Program Files (x86)\Boost-1.47.0\include\boost\asio\impl\io_service.hpp 88 1 cf-server 

回答

2

它看起來像功能thread_pool::run_item<task_return_t>接受一個非const打包任務引用(或指針),但的boost ::綁定做了const副本,無法傳遞參數。

沒有看到run_item簽名,我不能確切地說,但那是我看的地方。

編輯:看起來更深一點(一旦我可以得到一個副本升壓1_47),問題是boost::packaged_tasks不可複製,但是,boost::asio::io_service要求CompletionHandler是CopyConstructable。由於boost::packaged_tasks僅爲MoveConstructable/MoveAssignable,因此無法將它們直接傳遞給io_service。

Boost.Asio requirements for CompletionHandlers

+1

沒錯 - [我threads_pool \ task_manager固定它(http://code.google.com/p/cloudobserver/source/browse/trunk/CloudServer/src/cf-util/thread_pool .h?spec = svn1478&r = 1478)我創建了一個bufer函數,通過task()執行任務 – Rella