2016-05-15 7 views
0

テンプレートのリンクリストを作成するときに、list.hとlist.cppというファイルを用意するのではなく、list.hとlist.cpp.hを作成します。 .cpp.hファイルには、リンクリストクラスの実装が含まれています。 list.hの終わりで、#ENDIFの前に#include "list.cpp.h"があります。".cpp.h"ファイルでテンプレートの実装をコンパイルしないのはなぜですか?

私は、.cppファイルをヘッダーファイルにすることでコンパイルを避けることができますが、これはどのように機能するのでしょうか?過去に "template < class T>"を使用する実装をコンパイルする必要があったので、なぜこの実装ファイルをコンパイルする必要はありませんか?

編集:私の質問は、私がすでに読んでいたWhy can templates only be implemented in the header file?へのリンクを持つ重複としてマークされました。その質問は、通常の.cpp実装ファイルのように、テンプレートの実装をコンパイルする必要がない理由にはなりません。ヘッダーファイルを作成して実装をコンパイルするのを避けることができれば、実装するたびにそれをしないのはなぜですか?何が欠点ですか?

テンプレートをインスタンス化すると、そのテンプレートのインスタンスごとにコードがコンパイルされますか?私の.cppがその関数の1つでテンプレートを使用する必要がある場合、この初期コンパイルを避けるとヘッダファイルに変更されないのはなぜですか?

私の質問がより理にかなってくれることを願っています。

+1

* ".cppファイルをコンパイルしないようにすることで、ヘッダーファイルがコンパイルされることを理解しています。"ファイルには、プロジェクトに複数回含まれても安全なものだけが置かれます。 'int foo;'をヘッダファイルに入れ、そのファイルを複数のソースファイルに '#includeすると、リンカ時に' foo'の複数の宣言についてエラーが発生します。テンプレートはカテゴリ内のもので、インライン関数定義のように複数回インクルードするのが安全です。リンクが言うようにヘッダーに入ります。 – HostileFork

+0

あなたが求めていることは私には分かりません。 '#include'は単純なテキスト置換であるため、' .h'ファイル内のコードは '#include" file.h "'が翻訳されるとコンパイルされます。 「すべての実装でなぜそれをしないのですか」と言うと、正確にはどういう意味ですか?ヘッダファイルにすべてのテンプレートの実装を入れます(複数のユニットに見える必要がある場合) –

答えて

1

は、ヘッダーファイルとしてテンプレートを含めてです。.hファイルの最後に.ccp.hファイルが含まれているためです。

これは、普通 .hとテンプレートコードを2つのファイルに分けるプロジェクトの慣例です。

あなたのケースでは、テンプレートコードは通常の.cppコードにコンパイルされます。

これを避けたい理由は、「.cpp」ファイルごとに、そのcpp-unitで使用されるテンプレートコードの独自のコピーが作成されるため、もしA.cppとB.cppの両方T.cpp.hが含まれていれば、同じテンプレートを使用する場合には同じコードを作成し、すべての複製を削除するにはスマートオプティマイザを使用します。

3

ディレクティブは、現在コンパイル中のファイルにヘッダの内容をプルするだけです。したがって、テンプレートがコンパイルされます。それは、テンプレートが定義されているファイル#includeをすべての翻訳単位でコンパイルします。テンプレートが使用されると(そのファイルの後の方で)、インスタンス化されます。

関連する問題