"вызов неявно удаленного конструктора копии" ошибка при попытке передать аргумент методу - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь использовать пул потоков CPTL для своего приложения.

Итак, у меня есть функция с таким определением:

static void Invoke( int id, std::unique_ptr<BaseService> svc );

И попытался передать ее в CPTL Метод "pu sh" для постановки в очередь в пуле потоков:

pThreadPool->push( std::ref(App::Invoke), std::move( svc ) );

Но я получил эту ошибку:

/home/hadi/CLionProjects/App/App.cpp:211:27: error: no matching member function for call to 'push'
    pThreadPool->push( std::ref(App::Invoke), std::move( svc ) );
    ~~~~~~~~~~~~~^~~~
/home/hadi/CLionProjects/App/include/cptl/ctpl.h:152:14: note: candidate template ignored: substitution failure [with F = std::__1::reference_wrapper<void (int, std::__1::unique_ptr<BaseService, std::__1::default_delete<BaseService> >)>, Rest = <std::__1::unique_ptr<BaseService, std::__1::default_delete<BaseService> >>]: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<BaseService, std::__1::default_delete<BaseService> >'
        auto push(F && f, Rest&&... rest) ->std::future<decltype(f(0, rest...))> {
             ^                                                        ~~~~
/home/hadi/CLionProjects/App/include/cptl/ctpl.h:171:14: note: candidate function template not viable: requires single argument 'f', but 2 arguments were provided
        auto push(F && f) ->std::future<decltype(f(0))> {
             ^
1 error generated.

Кто-нибудь, пожалуйста, скажите мне, как это исправить? Спасибо.

1 Ответ

1 голос
/ 14 июля 2020

Кажется, что CPTL либо имеет ошибку в строке , 152 , либо не поддерживает аргументы только для перемещения (не могу найти по нему никакой документации, поэтому не могу быть уверен):

    auto push(F && f, Rest&&... rest) ->std::future<decltype(f(0, rest...))> {

Несмотря на то, что push использует std::forward<Rest>(rest)... в вызове, он использует rest... в SFINAE, что дает сбой и исключает перегрузку из списка жизнеспособных кандидатов.

Обычно аргументы упакованные задачи хранятся в очереди и, следовательно, должны быть копируемыми. Это исключает использование unique_ptr, поскольку он не копируется (он уникален!).

В качестве обходного пути вы можете использовать shared_ptr или, если время жизни svc превышает время жизни пула потоков , необработанный указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...