C++ 11 - 传递成员函数到线程给出:没有重载函数需要2个参数

问题描述:

从我抬头看,我的语法是正确的,但我的编译器(VS2015)抱怨。请注意,我正在使用命名空间EE与类网络。下面的代码C++ 11 - 传递成员函数到线程给出:没有重载函数需要2个参数

//code that doens't work 
    thread clientThread(&ee::Network::clientRun, new ee::Network); 

*注:在真正的代码,我没有要求新作为参数,我做到了,在这里,以缩短代码。

我已经测试过这些函数,他们工作,我只是无法让他们使用线程工作。这是他们的签名。

void serverRun(); 
    void clientRun(); 
    void clientRun(string ip); 

我的错误是:

  1. 错误C2661 '的std ::螺纹::线程':没有重载函数采用2个参数

  2. ABC没有构造“的std ::实例线程::线程“匹配参数列表

有没有人有任何见解,可能会发生什么在这种情况下?

+1

也许不那么愚蠢的问题,包括你'',对不对?我们没有太多的工作在这里。 – WhozCraig

+1

这看起来像一个Visual C++错误代码 - 你使用的是什么版本? –

+3

另外,您有一个模糊问题。尝试'void(ee :: Network :: * threadProc)()=&ee :: Network :: clientRun;线程clientThread(threadProc,new ee :: Network);' –

本的建议解决了我的问题,但我不知道为什么。

问题出在第一个参数&ee::Network::clientRun。 clientRun有2个重载,但是在模板推导的时候(为了推导出参数类型为std::thread::thread<>),编译器还不能区分哪个重载更有效。

Ben的解决方案工作,因为调用之前,剧组已经完成了编译器的工作,因为它 - 通过指定的Network::clientRun类型为void (ee::Network*)(void),而不是同样有效void (ee::Network*)(string)

一些例子:

#include <thread> 
#include <string> 

struct Network 
{ 
    void clientRun(); 
    void clientRun(std::string); 
}; 

int main() 
{ 
    // not ok... 
// std::thread clientThread(&Network::clientRun, new Network); 

    // ok - tells the compiler which overload 
    auto member_function = static_cast<void (Network::*)()>(&Network::clientRun); 
    std::thread clientThreadA(member_function, new Network); 

    // also ok 
    using call_type = void (Network::*)(); 
    std::thread clientThreadB(call_type(&Network::clientRun), new Network); 
}