【问题标题】:Boost bind inside Boost packaged_task. Why boost asio thinks its not CompletionHandler?Boost packaged_task 中的 Boost 绑定。为什么 boost asio 认为它不是 CompletionHandler?
【发布时间】:2011-11-07 09:57:13
【问题描述】:

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

【问题讨论】:

    标签: c++ boost boost-asio boost-thread boost-bind


    【解决方案1】:

    看起来函数 thread_pool::run_item&lt;task_return_t&gt; 接受一个非常量打包的任务引用(或指针),但 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

    【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2011-08-06
    相关资源
    最近更新 更多