次の方法で共有


明示的なインスタンス化

明示的なインスタンス化によって、テンプレート化されたクラスまたは関数をコードで実際に使用することなく、そのインスタンスを作成できます。 配布にテンプレートを使用するライブラリ (.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 キーワードは、クラス本体の外部で定義されたメンバー関数にのみ適用されます。 クラス宣言内で定義されている関数はインライン関数と見なされ、常にインスタンス化されます。

関連項目

関数テンプレート