Основные проблемы на ThreadPool::enqueue
:
std::function<void(size_t)> task1 = std::bind( std::forward<F>(f), std::placeholders::_1, std::forward<Args>(args)... );
Здесь тип task1
равен std::function<void(std::size_t)>
, но результат std::bind
при оценке с помощью funct
может быть преобразован в std::function<bool(std::size_t)>
, и хотя @TC указывает, вы можете присвоить результат от bind
до task1
, чтобы пройти от task1
до std::make_shared
, вам необходимо соблюдать return_type
, что у вас есть.
Измените вышеприведенное на:
std::function<return_type(size_t)> task1 = std::bind( std::forward<F>(f), std::placeholders::_1, std::forward<Args>(args)... );
Теперь то же самое для:
auto task = std::make_shared< std::packaged_task<return_type()> >( task1 );
но в данном случае это тип параметра, который отсутствует. Измените его на:
auto task = std::make_shared< std::packaged_task<return_type(std::size_t)> >( task1 );
ThreadPool::tasks
хранить функциональные объекты типа std::function<void(std::size_t)>
, но вы храните лямбда-выражения, которые не получают аргументов. Измените tasks.emplace(...)
на:
tasks.emplace([task](std::size_t a){ (*task)(a); });