違い - c++17 コンパイラ



C++ 11メンバー関数によるスレッドの初期化コンパイルエラー (1)

パラメータを取らない呼び出し可能オブジェクトが必要です。

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

トリックをするべきです。 これは、 obj A::fooを呼び出す呼び出し可能エンティティを作成する効果があります。

その理由は、 A非静的メンバー関数は、暗黙のうちに型(おそらくcv修飾) A*最初のパラメーターを取るためです。 obj.foo()を呼び出すと、事実上A::foo(&obj)呼び出されます。 あなたがそれを知ったら、上記の呪文は完全に理にかなっています。

この質問にはすでに答えがあります。

私は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 &&、_Args && ...)[_Callable = void(A :: *)()、_Args = {} ]

/usr/include/c++/4.6/thread:133:7:注:引数1の ''から 'void(A :: * &&)()'への変換は知られていません

/usr/include/c++/4.6/thread:128:5:note:std :: thread :: thread(std :: thread &&)

/usr/include/c++/4.6/thread:128:5:注:引数1の ''から 'std :: thread &&への変換は知られていません

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

/usr/include/c++/4.6/thread:124:5:注:候補者は0個の引数を期待しています、1個が与えられています





member