2013-03-15 13 views
13

C++ 11スレッドを使い始めたばかりで、(おそらく愚かな)エラーに苦しんでいます。 これは、プログラム私の例である: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; 
} 

は、純粋なメンバ関数からスレッドを開始することが可能ですか?そうでない場合は、foo関数をオブジェクトobjの関数でこのスレッドを作成するにはどうすればできますか? ありがとうございます!

これはコンパイルエラーです:

thread_test.cpp: In function ‘int main()’: thread_test.cpp:32:22: error: no matching function for call to ‘std::thread::thread()’

thread_test.cpp:32:22: note: candidates are:

/usr/include/c++/4.6/thread:133:7: note: std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (A::*)(), _Args = {}]

/usr/include/c++/4.6/thread:133:7: note: no known conversion for argument 1 from ‘’ to ‘void (A::*&&)()’

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

/usr/include/c++/4.6/thread:128:5: note: no known conversion for argument 1 from ‘’ to ‘std::thread&&’

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

/usr/include/c++/4.6/thread:124:5: note: candidate expects 0 arguments, 1 provided

+3

単純なラムダ: '[&](){obj.foo();}'を試してください。 [フルコードはこちら](http://liveworkspace.org/code/4Fh1lL$1)。 – BoBTFish

+0

+1:小さくても完全なコード例と完全なエラーメッセージ。ここに書かれているコードスニペットはタブが好きではないことに注意してください(私はこの記事であなたのためにこれを修正しました)。 – Angew

+0

ありがとうAngew、私は確かに将来の記事のタブを変更します。 – Rob013

答えて

20

あなたはとても

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

はトリックを行う必要があり、何のパラメータを取っていない呼び出し可能オブジェクトが必要です。これはA::fooobjに呼び出す呼び出し可能なエンティティを作成する効果があります。 の非スタティックメンバ関数は、暗黙の型(おそらくcv修飾)のA*の第1パラメータをとります。 obj.foo()に電話をすると、効果的にA::foo(&obj)が呼び出されます。一度それを知って、上記の呪文は理にかなっています。

+0

完璧なおかげで!既存の質問を再掲載して申し訳ありませんが、おそらく適切なタグがありません。 Btw、今それは動作します! – Rob013

+2

@ Rob013喜んで助けてくれました。実際には、私はちょうどこれが重複で十分に説明されていないことを認識しました。 – juanchopanza

+0

@juanchopanza私は、メンバー関数(非静的)がその型の暗黙の最初のパラメータ(そのインスタンスのこのポインタ)を取るということを理解しています。しかし、通常のメンバ関数(例:A :: foo(&obj);))を呼び出すために、引数としてオブジェクトを渡すと、なぜそれはうまくいかないのですか?このコンセプトのリンクはどれもうまくいくでしょう。ありがとう.. –

関連する問題