C++使用新线程调用函数,没有构造函数实例与参数列表匹配

C++ calling function with new thread, no instance of constructor matches argument list

本文关键字:实例 构造函数 参数 列表 函数 新线程 调用 线程 C++      更新时间:2023-10-16

使用新线程调用函数时遇到一些问题。错误消息为:

2 IntelliSense:没有构造函数"std::thread::thread"的实例与参数列表匹配参数类型为:(,std::reference_wrapper,CPoint(c:\Users\Lew\Downloads\Programmers Test(1(\Start\ProgTest95\ProgTest95.cpp 339 23 ProgTest95

错误1错误C2661:"std::thread::thread":没有重载函数接受3个参数c:\users\lew\downloads\programmers test(1(\start\progtest95\progtest95.cpp 339 1 progtest95

这是我的代码:

        thread floodThread(FloodFills, std::ref(m_screenDib), mid); //error here
        FloodFills(&m_screenDib, mid); //this works

这是我试图调用的函数:

 void FloodFills(CDIB32* scr, CPoint& mid)

我不明白为什么在使用新线程时函数重载不起作用。

std::ref只创建引用包装器,在第二个示例中,您从m_screenDib构造指针,但在线程版本号中。

既然您说它有另一个重载,编译器就无法选择要发送给函数的FloodFills的哪个版本。所以,帮他吧。

auto flFnc = static_cast<void(*)(CDIB32*, CPoint&)>(FloodFills);
thread floodThread(flFnc, &m_screenDib, std::ref(mid));

std::ref引用的包装器,而不是指针。当你调用这样的函数时

FloodFills(&m_screenDib, mid);

第一个参数作为指针传递。参考!=指针。

取而代之的是

std::thread floodThread(FloodFills, &m_screenDib, mid);