明示的なインスタンス化

明示的なインスタンス化によって、テンプレート化されたクラスまたは関数をコードで実際に使用することなく、そのインスタンスを作成できます。 配布用のテンプレートを使用するライブラリ (.lib) ファイルを作成する場合は、この方法が便利です。そのため、インスタンス化されないテンプレート定義はオブジェクト (.obj) ファイルに格納されません。

次のコードは int 変数と 6 つの項目に対して明示的に MyStack をインスタンス化します。

template class MyStack<int, 6>;

このステートメントは、オブジェクトのためのストレージを予約しないで MyStack のインスタンス化を作成します。 コードはすべてのメンバーに対して生成されます。

次の行はコンストラクター メンバー関数のみを明示的にインスタンス化します。

template MyStack<int, 6>::MyStack( void );

関数テンプレートは、「関数テンプレートのインスタンス化」の例に示すように、特定の型の引数を使用してテンプレートを再宣言することで、明示的にインスタンス化できます。

extern キーワードを使用して、メンバーが自動的にインスタンス化されないようにすることができます。 たとえば、次のようになります。

extern template class MyStack<int, 6>;

同様に、外部のインスタンス化されていないメンバーとして特定のメンバーを次のようにマークできます。

extern template MyStack<int, 6>::MyStack( void );

extern キーワードを使用して、コンパイル時、複数のオブジェクト モジュールで同じコードがインスタンスされないようにできます。 関数が呼び出される場合には、少なくとも 1 つのリンクされたモジュールで指定した明示的なテンプレート パラメーターを使用して、テンプレート関数をインスタンス化する必要があります。そのようにインスタンス化しないと、プログラムのビルド時にリンカー エラーが発生します。

注意

特殊化の extern キーワードは、クラス本体の外部で定義されたメンバー関数にのみ適用されます。クラス宣言内で定義されている関数はインライン関数と見なされ、常にインスタンス化されます。

参照

関連項目

関数テンプレート