クラス テンプレートのインスタンス化
関数テンプレートとは異なりテンプレート クラスのインスタンスを作成する場合はクラス テンプレートの引数を指定して明示的にクラスをインスタンス化する必要があります。TempClass のインスタンスを作成するには :
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
コンパイラはクラスまたは関数をインスタンス化するときにテンプレート クラスまたは関数のコードを生成します。このメンバー関数はクラスの作成時に呼び出される仮想メンバー関数でインスタンス化されるときにインスタンス化されます。これにより他のユーザー用のテンプレートを使用してライブラリがビルドの問題が発生する可能性があります。詳細については明示的なインスタンス化 を参照してください。
クラス テンプレートは最初に特化してインスタンス化されます。コンパイラはクラスでこのテンプレート クラスのメンバーへの参照が行われるまでsizeof クラス テンプレートを使用してインスタンス化しないまたはインスタンスが作成されます。
テンプレートの明示的な特殊化は特定の型のテンプレートのカスタマイズされたバージョンです。
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
template<> を持たない明示的な特殊化はエラーを生成します。Visual C++ .NET 2003 より前のバージョンの Visual C++ ではこの構文を使用しました :
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
テンプレートが明示的にインスタンス化されるか一度特化した場合は明示的にインスタンス化することはできませんしテンプレート引数のセットに対して同じプログラムをもう一度を特化されていません。異なるテンプレート引数との詳細に特化が許可されます。
特定のテンプレート引数の明示的なインスタンス化や専門分野がない場合テンプレートは最初に使用された位置から暗黙的にインスタンス化されます。
同じテンプレートの異なる種類のインスタンスが異なる型であるため1 種類のテンプレートの特化したクラスまたはインスタンスの静的メンバーには同じテンプレートの特化したクラスまたはインスタンスの静的メンバーとは異なります。