c++ - Boost packaged_task内部Boost绑定 为什么 boost asio认为它不是 CompletionHandler?

  显示原文与译文双语对照的内容

所以我所有的工作都发生在一个名为 thread_pool的类中。 无论run_item采用什么方法,这里代码都将起作用:


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安装了我:


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.0includeboostasioimplio_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.0includeboostasioimplio_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.0includeboostasioimplio_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.0includeboostasioimplio_service.hpp 88 1 cf-server

时间: 原作者:

看起来这个函数 thread_pool::run_item<task_return_t> 接受非const打包任务引用( 或者指针),但 boost::bind 生成了 const 副本,并且无法传递参数。

无法看到 run_item 签名,我不能确切地说明,但是这就是我想要的。

编辑:稍微看一看( 我可以找到 boost 1 _47的拷贝),问题是 boost::packaged_tasks 不是 copyable,但是 boost::asio::io_service 要求CompletionHandler是 CopyConstructable 。 由于 boost::packaged_tasks 只有 moveconstructable/MoveAssignable,所以不能直接将它们传递到 io_service 。

请参阅 Boost.Asio 对 CompletionHandlers的要求。

原作者:
...