c++ 11 - 将成员函数传递给线程给出 : no overloaded function takes 2 arguments

标签 c++ multithreading function member

根据我的查询,我的语法是正确的,但我的编译器 (VS2015) 有问题。请注意,我将 namespace ee 与类网络一起使用。这是代码

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

*注意:在实际代码中我没有调用 new 作为参数,我在这里这样做是为了缩短代码。

我已经测试了这些功能并且它们可以工作,我只是无法使用线程让它们工作。这是他们的签名。

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

我的错误是:

  1. 错误 C2661“std::thread::thread”:没有重载函数需要 2 个参数

  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);
}

关于c++ 11 - 将成员函数传递给线程给出 : no overloaded function takes 2 arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38794207/

相关文章:

二维数组指针的 C++ 内存泄漏

c++ - 使用 clCreateFromGLTexture 的 opencl/opengl 互操作无法绘制到纹理(纹理黑色)

C++ stringstream 转换为 double with operator>>

multithreading - grails sessionFactory.currentSession.flushMode无法与线程一起使用?

c++ - 开始学习如何编写包含互斥量和信号量使用的极其简单的多线程 C++ 程序的最佳方法是什么?

c++ - 提取函数的返回类型而不调用它(使用模板?)

Python 线程堆栈大小和段错误

r - 基于具有附加条件的其他列,在 R 中创建新列

javascript - 当事件触发时,如何在 javascript 中使用数组来匹配 div?

javascript - 当 Controller 中的 $scope 值更改时,$scope 值不会在 View 中更新