我在使用新线程调用函数时遇到了一些问题。 错误消息为:
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 < / p>
这是我的代码:
thread floodThread(FloodFills, std::ref(m_screenDib), mid); //error here
FloodFills(&m_screenDib, mid); //this works
这是我试图打电话的功能:
void FloodFills(CDIB32* scr, CPoint& mid)
我不明白为什么在使用新线程时函数重载不起作用。
答案 0 :(得分:3)
std::ref
只创建引用包装器,在第二个示例中,您构造了来自m_screenDib
的指针,但是在线程版本中 - 没有。
而且,既然你说它有另一个重载 - 编译器无法选择你想要发送到哪个版本的FloodFills
。所以,请帮助他。
auto flFnc = static_cast<void(*)(CDIB32*, CPoint&)>(FloodFills);
thread floodThread(flFnc, &m_screenDib, std::ref(mid));
答案 1 :(得分:1)
std::ref
是引用的包装器,而不是指针。当你调用像
FloodFills(&m_screenDib, mid);
第一个参数作为指针传递。参考!=指针。
取而代之的是
std::thread floodThread(FloodFills, &m_screenDib, mid);