ошибка: отсутствует соответствующий конструктор для инициализации проблемы 'std :: thread' в указателе функции перенаправления на поток - PullRequest
0 голосов
/ 26 января 2019

Я столкнулся с проблемой при пересылке вызываемого объекта (указателя функции) на нить. Вот пример кода, который пытается достичь.

#include <iostream>
#include <thread>                   

using namespace std;

void my_func(int x, int y, int z){
    cout << "X: " << x << "\tY: " << y << "\tZ "<<z << endl;
}

template <typename T, typename ...  Args>
void my_thread(T func, Args&&... args){
    // Do something
    func(forward<Args&&>(args)...);
}

template <typename T, typename ...  Args>
void call_thread(T func,  Args&& ... args){
     // Do something
    thread t1(my_thread, func, forward<Args&&>(args)...);
    t1.detach();
}

int main()
{
    call_thread(my_func, 2,5,6);
    return 0;
}

Ошибка:

In instantiation of 'void call_thread(T, Args&& ...) [with T = void (*)(int, int, int); Args = {int, int, int}]':
required from here

error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, void (*&)(int, int, int), int, int, int)'
    thread t1(my_thread, func, forward<Args&&>(args)...);
                                                       ^

Ответы [ 2 ]

0 голосов
/ 26 января 2019

ИМХО, не стоит инициализировать std :: thread в функции, где он сразу выходит из области видимости.Лучше отслеживать объект std :: thread.В любом случае, ваша функция my_thread () кажется мне ненужной, поскольку call_thread () выполняет вызов функции потока, которая передается в нее (func).Приведенный ниже код работает при компиляции с -lpthread в Arch Linux x86_64:

#include <iostream>
#include <thread>  
#include <utility>                 

using namespace std::chrono_literals;

void my_func(int x, int y, int z){
    std::cout << "X: " << x << "\tY: " << y << "\tZ "<<z << std::endl;
}

template <typename T, typename ...  Args>
void call_thread(T&& func, Args&& ... args) {
     // Do something
    std::thread t1(std::forward<T>(func), std::forward<Args>(args)...);
    t1.detach();
}

int main() {
    call_thread(my_func, 2, 5, 6);
    std::this_thread::sleep_for(5s);
    return 0;
}

Кстати, вам нужен спящий поток в конце;в противном случае ваша программа достигнет return 0 и завершит работу, прежде чем my_func () выведет значения!

0 голосов
/ 26 января 2019

В объявлении объявления

thread t1(my_thread, func, forward<Args&&>(args)...);

, поскольку my_thread - это имя шаблона функции, по сути, это большой набор различных функций.Но чтобы создать экземпляр конструктора std::thread и создать std::thread, компилятору необходимо выбрать только одну специализацию my_thread и конструктор std::thread.Поскольку конструктор thread настроен на то, чтобы вообще принимать любой вызываемый тип в качестве первого аргумента, нет прямой связи между вызываемым и аргументами, которые помогли бы объединить его в один тип, и компилятор не может вычислитьэто само по себе.

Так что укажите правильную my_thread специализацию:

thread t1(my_thread<T, Args...>, func, forward<Args&&>(args)...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...