错误:在将函数指针转发到线程时,没有匹配的构造函数用于初始化“ std :: thread”问题

时间:2019-01-26 12:19:01

标签: c++11

我在将可调用对象(函数指针)转发到     线。     这是尝试实现的示例代码。

#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 :(得分:0)

在声明中

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

由于my_thread是函数模板的名称,因此它实质上是一大堆不同的函数。但是,要实例化std::thread构造函数并创建std::thread,编译器只需选择my_threadstd::thread构造函数的一种特殊化。由于thread构造函数被设置为完全接受任何可调用类型作为第一个参数,因此在可调用和参数之间没有直接的关系可以将其强制为一种类型,并且编译器可以不能自行解决。

因此请指定正确的my_thread专业化名称:

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

答案 1 :(得分:0)

恕我直言,在一个立即超出范围的函数中初始化std :: thread并不是一个好主意。最好跟踪std :: thread对象。无论如何,您的my_thread()函数对我来说似乎是不必要的,因为call_thread()会调用传递给它的线程函数(func)。在Arch Linux x86_64上使用-lpthread编译时,以下代码有效:

#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;
}

顺便说一句,您需要线程在最后进入睡眠状态;否则,在my_func()打印出值之前,您的程序将到达return 0并退出!