2016-07-20 14 views
-1

テンプレートクラス定義を含むヘッダーファイルを変更すると、マイコンパイラ(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キーを押して「ビルド」するだけですが、時間がかかります。

+3

のいずれかで始まる行が含まれます。* .hファイルがコンパイルされていないことを確認してください。 * .hファイルは、* .cppファイルに#includeされます。 * .cppファイルがコンパイルされます。 –

+0

あなたのクラステンプレート定義( 'テンプレートクラス')は不完全です。これは、コンパイル単位に組み込むと楽しいコンパイラエラーを引き起こします。編集( 'template class Class')でもまだ不完全です。作成したソースコードは、たとえそれが簡単ではないとしても、投稿しないでください。 – IInspectable

+0

コードがビルドされ、実行されます。私はここに入力したときにそれを見逃しました。これはコンパイラのエラーに関する質問ではありませんが、とにかく感謝します。 – Hame

答えて

0

修正済み。 Visual Studioの[ソリューションエクスプローラ] - > [プロパティ] - > [アイテムの種類]でファイルを右クリックします。その特定のヘッダーファイルについては、C/C++コンパイラに設定されていました。 C/C++ヘッダーに変更した後、それは働いた。

解決策に新しいファイルを追加すると、フィルタを右クリックして[新しい項目を追加]をクリックすると問題が発生したと思います。ソースファイルが選択されている場合、私はそれをヘッダーファイルに変更するのをやっていませんでした、私はちょうどSomeName.hファイルに名前をつけます。違いがあるようです。これに基づいて、.vcxprojにはあなたのファイルがあり、<ClInclude>または<ClCompile>

0

ソースファイル(.cpp)のみがコンパイルされ、インクルードされたヘッダーファイル(.h)のコードがソースファイルにコピーされます。 ヘッダーファイルは個別にコンパイルされません。

Build出力ウィンドウからログをコピーできますか?

0

あなたが投稿したコードはバグで詰まっています。これが正常なコードの例であれば、何かが起こっている可能性があります。

上記のように、hファイルのコンパイルが表示されないはずです。そうするなら、それをcppファイルなどのようにコンパイルするように設定しているかもしれません。それはあなたが探しているはずの最初の場所です。

前処理段階でHファイルがCPPファイルに追加され、コンパイルオプションを選択すると読み込める長いソースファイルが生成されます。それが私の頭の上から何か分からない。これらの長いファイルを見ると、#include "Class.h"ステートメントが発生した時点でClass.hがUsage.cppに追加されていることがわかります。 Class.hの古いバージョンが含まれていない限り、あなたが何を記述しているかを見るのが難しい場合があります。プリコンパイルされたヘッダーとクラスを使用している場合を除きます。hファイルはPCHの一部であり、古いPCHファイルを使用しています。

ビルド(F7)ではなく、すべての時間にリビルドを使用すると、問題が消えると思われます。私はこれがPCH生成の問題のためだと思うので、stdafx.cppがPCHを再生成するように設定されていることを確認してください。

関連する問題