クラス テンプレートのインスタンス化
関数テンプレートとは異なり、クラス テンプレートをインスタンス化するときは、クラス テンプレートの引数を指定して明示的にクラスをインスタンス化する必要があります。 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 つの特殊化またはインスタンス化の静的メンバーは、同じテンプレートの異なる特殊化またはインスタンス化の静的メンバーとは異なります。