8

Run別のスレッドで実行することを目的としたオブジェクトが、純粋仮想関数を持つ基本クラスから派生するコードがあります。次の(簡略化されたテストコード)を取得して、新しいスレッドを実行できません。

#include <iostream>
#include <thread>
#include <functional>

class Base {
public:
    virtual void Run() = 0;
    void operator()() { Run(); }
};

class Derived : public Base {
public:
    void Run() { std::cout << "Hello" << std::endl; }
};

void ThreadTest(Base& aBase) {
    std::thread t(std::ref(aBase));
    t.join();
}

int main(/*blah*/) {
    Base* b = new Derived();
    ThreadTest(*b);
}

コードは正常にコンパイルされますが(これは戦いの半分です)、「Hello」が出力されることはありません。何か間違ったことをしていると、ある時点でランタイムエラーが発生することが予想されます。私はgccを使用しています。

編集:上記のコードは、VS2012でのコンパイルに失敗します。 error C2064: term does not evaluate to a function taking 0 arguments

std::refの代わりにラムダを使用する必要があります。

void ThreadTest(Base& aBase)
{
    std::thread t([&] ()
    {
        aBase.Run();
    });
    t.join();
}
4

1 に答える 1

3

同様の質問に対するこの回答で説明されているように、g++コマンドラインに-pthreadを追加する必要があります:https ://stackoverflow.com/a/6485728/39622 。

于 2013-01-30T18:07:48.377 に答える