テンプレートクラス定義を含むヘッダーファイルを変更すると、マイコンパイラ(VS2015に付属するもの)はまずクラスがインスタンス化されたソースファイルを解析しますヘッダファイル。この結果、不正なバイナリが生成されます。C++コンパイラがヘッダーファイルの前にソースファイルを誤って解析する
しかし、ヘッダーファイルをもう一度変更してコンパイルすると、解析の順序が正しい(ヘッダが最初に、ソースが後になります)、結果のバイナリが正しいジョブを実行します。
コンパイラがファイルを解析する順序は、[ビルド]出力ウィンドウに表示され、並列またはマルチプロセッサのコンパイルオプションは有効になっていません。
これを100%成功率で再現できます。私は間違ったことをしていますか?私が変えることができるものはありますか?
コードは次のとおりです。ビルド/リビルド全
Class.h
template<class T> class Class {
void foo() {
WriteToFile("A");
}
Usage.cpp
Class* c = new C();
c->foo();
。ファイルに出力:A.
ステップ1:
はfoo()
に次の行を追加します。WriteToFile("B");
コンパイル:出力の順序:Usage.cpp、ファイル内Class.h 出力:
ステップ2:
foo()
に行を次のように追加します。WriteToFile("C")
; ` コンパイル:出力の順序:ファイル内Class.h、Usage.cpp 出力:ABC
いつまでも同じ動作を続けます。
注:完全に再構築した後はF7キーを押して「ビルド」するだけですが、時間がかかります。
のいずれかで始まる行が含まれます。* .hファイルがコンパイルされていないことを確認してください。 * .hファイルは、* .cppファイルに#includeされます。 * .cppファイルがコンパイルされます。 –
あなたのクラステンプレート定義( 'テンプレートクラス')は不完全です。これは、コンパイル単位に組み込むと楽しいコンパイラエラーを引き起こします。編集( 'template class Class')でもまだ不完全です。作成したソースコードは、たとえそれが簡単ではないとしても、投稿しないでください。 –
IInspectable
コードがビルドされ、実行されます。私はここに入力したときにそれを見逃しました。これはコンパイラのエラーに関する質問ではありませんが、とにかく感謝します。 – Hame