从我查找的内容来看,我的语法是正确的,但我的编译器(VS2015)正在抱怨。注意,我使用名为Network的名称空间ee。这是代码
//code that doens't work
thread clientThread(&ee::Network::clientRun, new ee::Network);
*注意:在实际代码中我没有将new称为参数,我在这里做了缩短代码。
我已经测试了这些功能并且它们正常工作,我只是无法让它们使用线程工作。这是他们的签名。
void serverRun();
void clientRun();
void clientRun(string ip);
我的错误是:
错误C2661' std :: thread :: thread':没有重载函数需要2个参数
abc没有构造函数的实例" std :: thread :: thread"匹配参数列表
有没有人对这种情况下可能发生的事情有任何见解?
答案 0 :(得分:4)
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);
}