C ++ 11螺纹初始化与成员函数编译错误[重复](C++ 11 Thread initializa

2019-07-21 17:38发布

这个问题已经在这里有一个答案:

  • 先从成员函数螺纹 5回答

我刚开始使用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:在函数 '诠释主()':thread_test.cpp:32:22:错误:调用没有匹配的函数 '的std ::螺纹::螺纹()'

thread_test.cpp:32:22:注意:考生:

/usr/include/c++/4.6/thread:133:7:注意:性病::螺纹::线程(_Callable &&,_args && ......)与_Callable =无效(A :: *)(),_args = {} ]

/usr/include/c++/4.6/thread:133:7:注:没有已知的转换用于从 '参数1' 到 '空隙(A :: * &&)()'

/usr/include/c++/4.6/thread:128:5:注:标准::螺纹::线程(的std ::线程&&)

/usr/include/c++/4.6/thread:128:5:注意:没有已知的转换为参数1从'到“的std ::线程&&”

/usr/include/c++/4.6/thread:124:5:注意:性病::螺纹::线程()

/usr/include/c++/4.6/thread:124:5:注:候选人预计0参数,提供1

Answer 1:

你需要一个调用对象采取任何参数,因此

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

应该做的伎俩。 这具有它调用可调用实体的影响A::fooobj

其原因是,的非静态成员函数A采用类型的隐式第一参数(可能CV合格) A* 。 当你调用obj.foo()你实际上调用A::foo(&obj) 一旦你知道,上面的咒语是非常合情合理的。



文章来源: C++ 11 Thread initialization with member functions compiling error [duplicate]