Увеличить привязку внутри Boost packaged_task. Почему boost asio считает, что это не CompletionHandler? - PullRequest
1 голос
/ 31 августа 2011

Так что вся моя работа происходит внутри класса с именем 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

1 Ответ

2 голосов
/ 31 августа 2011

Похоже, что функция 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 для CompletionHandlers

...