C ++ 11使用成员函数编译错误的线程初始化

时间:2013-03-15 14:07:13

标签: c++ multithreading class c++11 member

我刚开始使用C ++ 11线程而且我一直在努力(可能是愚蠢的)错误。 这是我的示例程序:

#include <iostream>
#include <thread>
#include <future>
using namespace std;

class A {
public:
  A() {
    cout << "A constructor\n";
  }

  void foo() {
    cout << "I'm foo() and I greet you.\n";
  }

  static void foo2() {
    cout << "I'm foo2() and I am static!\n";
  }

  void operator()() {
    cout << "I'm the operator(). Hi there!\n";
  }
};

void hello1() {
  cout << "Hello from outside class A\n";
}

int main() {
  A obj;
  thread t1(hello1); //  it works
  thread t2(A::foo2); // it works
  thread t3(obj.foo); // error
  thread t4(obj);     // it works

  t1.join();
  t2.join();
  t3.join();
  t4.join();
  return 0;
}

是否可以从纯成员函数启动线程?如果不是,我怎么能从对象 obj 中包装我的 foo 函数才能创建这样的线程? 提前谢谢!

这是编译错误:

  

thread_test.cpp:在函数'int main()'中:   thread_test.cpp:32:22:错误:没有匹配函数来调用'std :: thread :: thread()'

     

thread_test.cpp:32:22:注意:候选人是:

     

/ usr / include / c ++ / 4.6 / thread:133:7:注意:std :: thread :: thread(_Callable&amp;&amp;,_Args&amp;&amp; ...)[with _Callable = void(A :: *)(),_ Args = {}]

     

/ usr / include / c ++ / 4.6 / thread:133:7:注意:参数1从''到'void(A :: *&amp;&amp;)()'

没有已知的转换      

/ usr / include / c ++ / 4.6 / thread:128:5:注意:std :: thread :: thread(std :: thread&amp;&amp;)

     

/ usr / include / c ++ / 4.6 / thread:128:5:注意:参数1从''到'std :: thread&amp;&amp;'

没有已知的转换      

/ usr / include / c ++ / 4.6 / thread:124:5:注意:std :: thread :: thread()

     

/ usr / include / c ++ / 4.6 / thread:124:5:注意:候选人需要0个参数,1提供

1 个答案:

答案 0 :(得分:20)

你需要一个不带参数的可调用对象,所以

thread t3(&A::foo, &obj);

应该做的伎俩。这具有创建可调用实体的效果,该实体在A::foo上调用obj

原因是A的非静态成员函数采用隐式的第一个类型参数(可能是cv限定的)A*。当您致电obj.foo()时,您实际上正在呼叫A::foo(&obj)。一旦你知道了,上面的咒语就很有道理了。