gpt4 book ai didi

c++ - Boost 在 Boost packaged_task 中绑定(bind)。为什么 boost asio 认为它不是 CompletionHandler?

转载 作者:行者123 更新时间:2023-11-30 04:33:01 24 4
gpt4 key购买 nike

所以我所有的工作都发生在名为 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.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

最佳答案

看起来像函数thread_pool::run_item<task_return_t>接受一个非常量打包的任务引用(或指针)但是 boost::bind 生成了一个 const复制,无法传递参数。

没有看到 run_item签名,我不能说得很清楚,但我会去那里找。

编辑:看得更深一点(一旦我能找到 boost 1_47 的拷贝),问题是 boost::packaged_tasks不可复制,但是,boost::asio::io_service要求 CompletionHandler 是 CopyConstructable。自 boost::packaged_tasks只有 MoveConstructable/MoveAssignable,您不能将它们直接传递给 io_service。

参见 Boost.Asio requirements for CompletionHandlers

关于c++ - Boost 在 Boost packaged_task 中绑定(bind)。为什么 boost asio 认为它不是 CompletionHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com