テンプレート定義は、2 つの方法で構成できます。1 つは定義取り込み型で、もう 1 つは定義分離型です。定義取り込み型の構成の方が、テンプレートのコンパイルをより広範囲に渡って制御できます。
テンプレートを使用するファイルの中にテンプレートの宣言と定義が含まれていれば、そのファイルは定義取り込み型の構成です。次にその例を示します。
main.cc template <class Number> Number twice( Number original ); template <class Number> Number twice( Number original ) { return original + original; } int main( ) { return twice<int>( -3 ); }
テンプレートを使用するファイルがテンプレートの宣言と定義の両方を含むファイルをインクルードしている場合、そのテンプレートを使用するファイルも定義取り込み型の構成になります。次にその例を示します。
twice.h #ifndef TWICE_H #define TWICE_H template <class Number> Number twice( Number original ); template <class Number> Number twice( Number original ) { return original + original; } #endif main.cc #include“twice.h” int main( ) { return twice( -3 ); }
ここでは、テンプレートヘッダーをべき等にすることが重要です (「べき等なヘッダーファイル」を参照)。
テンプレート定義を構成するには、次の例に示すように、テンプレート定義ファイルに定義を入れることもできます。
twice.h template <class Number> Number twice( Number original ); twice.cc template <class Number> Number twice( Number original ) { return original + original; } main.cc #include“twice.h” int main( ) { return twice<int>( -3 ); }
テンプレート定義ファイルにインクルードするヘッダーファイルは必ずべき等でなければなりません。
実際にはヘッダーファイルのインクルードをまったく必要としないこともよくあります (「べき等なヘッダーファイル」を参照)。
テンプレート定義ファイルには一般的にソースファイルの拡張子 (.c、.C、.cc、.cpp、.cxx) が使用されますが、テンプレート定義ファイルは実際にはヘッダーファイルです。コンパイラは、必要に応じてそれらを自動的にインクルードします。テンプレート定義ファイルは、個別にコンパイルするべきものではありません。
テンプレート宣言とテンプレート定義を別々のファイルに置く場合は、その定義ファイルの構成、名前、置き場所に細心の注意を払う必要があります。定義の置き場所を、コンパイラに対して明示的に知らせることが必要になる場合もあります。テンプレート定義の検索に関する規則については、『C ++ ユーザーズガイド』を参照してください。