明示的なインスタンス化によって、テンプレート化されたクラスまたは関数をコードで実際に使用することなく、そのインスタンスを作成できます。 配布にテンプレートを使用するライブラリ (.lib
) ファイルを作成する場合に便利であるため、予期しないテンプレート定義はオブジェクト (.obj
) ファイルに配置されません。
例
次のコードは int
変数と 6 つの項目に対して明示的に MyStack
をインスタンス化します。
template class MyStack<int, 6>;
このステートメントは、オブジェクトのためのストレージを予約しないで MyStack
のインスタンス化を作成します。 コードはすべてのメンバーに対して生成されます。
次の行はコンストラクター メンバー関数のみを明示的にインスタンス化します。
template MyStack<int, 6>::MyStack( void );
関数テンプレートのインスタンス化の例に示すように、特定の型引数を使用して関数テンプレートを明示的にインスタンス化して再宣言できます Function テンプレートのインスタンス化。
extern
キーワードを使用して、メンバーが自動的にインスタンス化されないようにすることができます。 次に例を示します。
extern template class MyStack<int, 6>;
同様に、外部のインスタンス化されていないメンバーとして特定のメンバーを次のようにマークできます。
extern template MyStack<int, 6>::MyStack( void );
extern
キーワードを使用して、コンパイル時、複数のオブジェクト モジュールで同じコードがインスタンス化されないようにできます。 関数が呼び出された場合は、少なくとも 1 つのリンクされたモジュールで指定された明示的なテンプレート パラメーターを使用して、関数テンプレートをインスタンス化する必要があります。 それ以外の場合は、プログラムのビルド時にリンカー エラーが発生します。
Note
特殊化の extern
キーワードは、クラス本体の外部で定義されたメンバー関数にのみ適用されます。 クラス宣言内で定義されている関数はインライン関数と見なされ、常にインスタンス化されます。