クラス・テンプレートと個々のクラスとの間の関係は、
クラスと個々のオブジェクトとの間の関係に似ています。
個々のクラスがオブジェクトのグループの構成方法を定義し、
一方、クラス・テンプレートがクラスのグループの生成方法を定義します。
クラス・テンプレート とテンプレート・クラス という用語の間の区別に注意してください。
テンプレート定義は、下記の点を除いて、テンプレートが生成し得る有効なクラス定義のいずれとも同一です。
template< template-parameter-list >
ここで、template-parameter-list は、次に示す種類のテンプレート・パラメーターの 1 つまたは複数を、 コンマで区切られたリストです。
詳述型指定子を使用して定義しなくても、クラス・テンプレートを宣言することができます。次に例を示します。
template<class L,class T> class key;
これにより、名前がクラス・テンプレート名として予約されます。 クラス・テンプレートのテンプレート宣言は、 すべてが、同じ型と同じ数のテンプレート引き数を持っていなければなりません。 クラス定義を含む 1 つのテンプレート宣言だけが許可されます。
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(); |
関連参照