クラス・テンプレートの宣言と定義

C++クラス・テンプレートを宣言してから、対応するテンプレート・クラスの宣言を行う必要があります。 クラス・テンプレートの定義は、どの変換単位でも 1 回しか現れません。クラス・テンプレートは、クラスのサイズを必要とする、またはクラスのメンバーを参照する、 テンプレート・クラスを使用する前に定義する必要があります。

次の例では、クラス・テンプレート key は、定義の前に宣言されます。 クラスのサイズは必要ないので、ポインター keyiptr の宣言は有効です。 ただし、keyi の宣言はエラー になります。

template  <class L> class key;      // class template declared,
                                    // not defined yet
                                    //
class key<int> *keyiptr;            // declaration of pointer
                                    //
class key<int> keyi;                // error, cannot declare keyi
                                    // without knowing size
                                    //
template <class L> class key        // now class template defined
{ /* ... */ };

クラス・テンプレートを定義する前に、対応するテンプレート・クラスを使用すると、 コンパイラーはエラーを発行します。 テンプレート・クラス名の外観を持つクラス名は、テンプレート・クラスであると見なされます。 言い換えれば、テンプレート・クラスの場合は、不等号括弧が有効なのは、クラス名の中だけです。

先の例では、詳述型指定子 class を使用して、クラス・テンプレート key およびポインター keyiptr を宣言します。keyiptr の宣言は、詳述型指定子なしで行うこともできます。

template  <class L> class key;            // class template declared,
                                          // not defined yet
                                          //
key<int> *keyiptr;                        // declaration of pointer
                                          //
key<int> keyi;                            // error, cannot declare keyi
                                          // without knowing size
                                          //
template <class L> class key              // now class template defined
{ /* ... */ };

関連参照

IBM Copyright 2003