古い質問かもしれませんが、以前に同じ問題を調べました。CLR ではコンパイル時にインクルードできないためstd::thead
、リンク時にのみ使用することができます。通常、ヘッダーでクラスを前方宣言し、それらを cpp ファイルにのみ含めることで、これを解決できます。ただし、ヘッダー ファイルで独自のクラスを前方宣言することはできますが、名前空間 std のクラスを宣言することはできません。C++11 標準 17.6.4.2.1 によると:
特に指定がない限り、名前空間 std または名前空間 std 内の名前空間に宣言または定義を追加する場合、C++ プログラムの動作は未定義です。
この問題の回避策は、前方宣言できるstd::thread
スレッド クラスを継承することです。このクラスのヘッダー ファイルは次のようになります。
#pragma once
#include <thread>
namespace Threading
{
class Thread : std::thread
{
public:
template<class _Fn, class... _Args> Thread(_Fn fn, _Args... args) : std::thread(fn, std::forward<_Args>(args)...)
{
}
private:
};
}
スレッドを使用したいヘッダーファイルで、次のように前方宣言できます。
#pragma once
// Forward declare the thread class
namespace Threading { class Thread; }
class ExampleClass
{
public:
ExampleClass();
void ThreadMethod();
private:
Threading::Thread * _thread;
};
ソースファイルでは、次のような theading クラスを使用できます。
#include "ExampleClass.h"
#include "Thread.h"
ExampleClass::ExampleClass() :
{
_thread = new Threading::Thread(&ExampleClass::ThreadMethod, this);
}
void ExampleClass::ThreadMethod()
{
}
それが誰にも役立つことを願っています。