c++ 11 - 将成员函数传递给线程给出:没有重载函数需要 2 个参数
c++ 11 - passing member function to thread gives: no overloaded function takes 2 arguments
根据我的查询,我的语法是正确的,但我的编译器 (VS2015) 有问题。请注意,我在 class 网络中使用名称空间 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" 匹配参数列表
有人知道在这种情况下会发生什么吗?
Ben's suggestion fixed my problem, but I'm not sure why.
问题出在第一个参数 &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);
}
根据我的查询,我的语法是正确的,但我的编译器 (VS2015) 有问题。请注意,我在 class 网络中使用名称空间 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" 匹配参数列表
有人知道在这种情况下会发生什么吗?
Ben's suggestion fixed my problem, but I'm not sure why.
问题出在第一个参数 &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);
}