テンプレートのリンクリストを作成するときに、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つでテンプレートを使用する必要がある場合、この初期コンパイルを避けるとヘッダファイルに変更されないのはなぜですか?
私の質問がより理にかなってくれることを願っています。
* ".cppファイルをコンパイルしないようにすることで、ヘッダーファイルがコンパイルされることを理解しています。"ファイルには、プロジェクトに複数回含まれても安全なものだけが置かれます。 'int foo;'をヘッダファイルに入れ、そのファイルを複数のソースファイルに '#includeすると、リンカ時に' foo'の複数の宣言についてエラーが発生します。テンプレートはカテゴリ内のもので、インライン関数定義のように複数回インクルードするのが安全です。リンクが言うようにヘッダーに入ります。 – HostileFork
あなたが求めていることは私には分かりません。 '#include'は単純なテキスト置換であるため、' .h'ファイル内のコードは '#include" file.h "'が翻訳されるとコンパイルされます。 「すべての実装でなぜそれをしないのですか」と言うと、正確にはどういう意味ですか?ヘッダファイルにすべてのテンプレートの実装を入れます(複数のユニットに見える必要がある場合) –