Eni*_*134 4 c++ multithreading function member
从我查找的内容来看,我的语法是正确的,但我的编译器(VS2015)却在抱怨。请注意,我将名称空间 ee 与类 Network 一起使用。这是代码
//code that doens't work
thread clientThread(&ee::Network::clientRun, new ee::Network);
Run Code Online (Sandbox Code Playgroud)
*注意:在实际代码中,我没有将 new 作为参数调用,我在这里这样做是为了缩短代码。
我已经测试了这些功能并且它们可以工作,但我无法使用线程使它们工作。这是他们的签名。
void serverRun();
void clientRun();
void clientRun(string ip);
Run Code Online (Sandbox Code Playgroud)
我的错误是:
错误 C2661“std::thread::thread”:没有重载函数需要 2 个参数
abc 没有构造函数“std::thread::thread”的实例与参数列表匹配
有没有人对这种情况下可能发生的事情有任何见解?
Ben 的建议解决了我的问题,但我不知道为什么。
问题在于第一个参数&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);
}
Run Code Online (Sandbox Code Playgroud)