クラス・テンプレート

C++クラス・テンプレートと個々のクラスとの間の関係は、 クラスと個々のオブジェクトとの間の関係に似ています。 個々のクラスがオブジェクトのグループの構成方法を定義し、 一方、クラス・テンプレートがクラスのグループの生成方法を定義します。

クラス・テンプレートテンプレート・クラス という用語の間の区別に注意してください。

クラス・テンプレート
これは、テンプレート・クラスの生成に使用されるテンプレートです。 クラス・テンプレートのオブジェクトは、宣言できません。

テンプレート・クラス
クラス・テンプレートのインスタンスです。

テンプレート定義は、下記の点を除いて、テンプレートが生成し得る有効なクラス定義のいずれとも同一です。

詳述型指定子を使用して定義しなくても、クラス・テンプレートを宣言することができます。次に例を示します。

template<class L,class T> class key;

これにより、名前がクラス・テンプレート名として予約されます。 クラス・テンプレートのテンプレート宣言は、 すべてが、同じ型と同じ数のテンプレート引き数を持っていなければなりません。 クラス定義を含む 1 つのテンプレート宣言だけが許可されます。

注:
テンプレート引き数リストがネストされている場合は、 内側のリストの終わりの > と外側のリストの終わりの > の間に分離スペースが必要です。 これがなければ、出力演算子 >> と 2 つの テンプレート・リスト区切り文字 > との間があいまいになります。

template<class L,class T> class key { /* ... */};
template<class L> class vector { /* ... */ };
 
int main ()
{
   class key <int, vector<int> > my_key_vector;
   // implicitly instantiates template
}

通常のクラス・メンバーのオブジェクトや関数のアクセスに使用されるどの手法でも、 個々のテンプレート・クラスのオブジェクトや関数メンバーをアクセスすることができます。 次のクラス・テンプレートがあるとします。

template<class T> class vehicle
{
public:
    vehicle() { /* ... */ }    // constructor
    ~vehicle() {};             // destructor
    T kind[16];
    T* drive();
    static void roadmap();
    // ...
};

そして、次の宣言を行います。

vehicle<char> bicycle; // instantiates the template

コンストラクター、構成オブジェクト、およびメンバー関数 drive() は、 次のいずれかを指定してアクセスできます (標準ヘッダー・ファイル <string.h> が、プログラム・ファイルに含まれているとします)。

constructor
vehicle<char> bicycle;
 
// constructor called automatically,
// object bicycle created
オブジェクト bicycle
strcpy (bicycle.kind, "10 speed");
bicycle.kind[0] = '2';
関数 drive() char* n = bicycle.drive();
関数 roadmap() vehicle<char>::roadmap();

関連参照

IBM Copyright 2003