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();
}