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

时间:2015-09-09 08:42:54

标签: c++ multithreading function overloading

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

  

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)

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

2 个答案:

答案 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);