C++ Boost绑定在Boost打包的任务中。为什么boost asio认为它不是CompletionHandler?
所以我所有的工作都发生在一个名为C++ Boost绑定在Boost打包的任务中。为什么boost asio认为它不是CompletionHandler?,c++,boost,boost-asio,boost-thread,boost-bind,C++,Boost,Boost Asio,Boost Thread,Boost Bind,所以我所有的工作都发生在一个名为thread\u pool的类中。无论run_项本身包含什么内容,此代码都将工作: 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(&am
thread\u pool
的类中。无论run_项本身包含什么内容,此代码都将工作:
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));
//...
模板
无效线程池::池项(boost::共享池ptrpt)
{
内部_任务.post(boost::bind(&thread_pool::run_item,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::共享池ptrpt)
{
boost::打包的_任务(boost::bind(&thread_pool::run_item,this,pt));
内部任务。职位(任务);
为什么?如何使其编译
我使用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.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
Error 6 Error C2665:'boost::asio::detail::zero\u arg\u handler\u test':两个重载都不能转换所有参数类型C:\Program Files(x86)\boost-1.47.0\include\boost\asio\impl\io\u service.hpp 88 1 cf server
错误9错误C2664:“void boost::asio::detail::task\u io\u service::post(Handler)”:无法将参数1从“const boost::packated\u task”转换为“boost::packated\u task”C:\Program Files(x86)\boost-1.47.0\include\boost\asio\impl\io\u service.hpp 90 1 cf server
错误8错误C2664:'T&boost::asio::detail::lvref(T)':无法将参数1从'const boost::packaged_task'转换为'boost::packaged_task'C:\Program Files(x86)\boost-1.47.0\include\boost\asio\impl\io_service.hpp 88 1 cf server
错误7错误C2664:“boost::asio::detail::clvref”:无法将参数1从“const boost::packaged_task”转换为“boost::packaged_task”C:\Program Files(x86)\boost-1.47.0\include\boost\asio\impl\io_service.hpp 88 1 cf server
函数thread\u pool::run\u item
似乎接受非常量打包的任务引用(或指针),但boost::bind进行了常量
复制,并且无法传递参数
如果看不到run\u项目
签名,我就说不清楚了,但我会去看
编辑:看得更深一点(一旦我能找到boost 147的副本),问题是,boost::packaged_任务
不可复制,但是,boost::asio::io_服务
要求CompletionHandler是可复制的。由于boost::packaged_任务
仅可移动构造/可移动分配,因此无法将它们直接传递给io_服务
请参见yep-我创建了一个bufer函数,该函数仅通过task()执行任务