Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost绑定在Boost打包的任务中。为什么boost asio认为它不是CompletionHandler?_C++_Boost_Boost Asio_Boost Thread_Boost Bind - Fatal编程技术网

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()执行任务