入れ子にされたクラス テンプレート
テンプレートはクラスまたはクラス テンプレート内で定義できます。その場合、メンバー テンプレートと呼ばれます。 クラスであるメンバー テンプレートは、入れ子になったクラス テンプレートと呼ばれます。 関数であるメンバー テンプレートは、「メンバー関数テンプレート」で説明します。
入れ子になったクラス テンプレートは、外部クラスのスコープ内のクラス テンプレートとして宣言されます。 外側のクラス内外で定義できます。
使用例
次のコードは、通常のクラス内の入れ子になったクラス テンプレートを示します。
// nested_class_template1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class X
{
template <class T>
struct Y
{
T m_t;
Y(T t): m_t(t) { }
};
Y<int> yInt;
Y<char> yChar;
public:
X(int i, char c) : yInt(i), yChar(c) { }
void print()
{
cout << yInt.m_t << " " << yChar.m_t << endl;
}
};
int main()
{
X x(1, 'a');
x.print();
}
入れ子になったクラス テンプレートを外側のクラスの外部で定義する場合は、クラス テンプレートのテンプレート パラメーター (クラス テンプレートのメンバーである場合) およびメンバー テンプレートのテンプレート パラメーターを前に付ける必要があります。
// nested_class_template2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
template <class T>
class X
{
template <class U> class Y
{
U* u;
public:
Y();
U& Value();
void print();
~Y();
};
Y<int> y;
public:
X(T t) { y.Value() = t; }
void print() { y.print(); }
};
template <class T>
template <class U>
X<T>::Y<U>::Y()
{
cout << "X<T>::Y<U>::Y()" << endl;
u = new U();
}
template <class T>
template <class U>
U& X<T>::Y<U>::Value()
{
return *u;
}
template <class T>
template <class U>
void X<T>::Y<U>::print()
{
cout << this->Value() << endl;
}
template <class T>
template <class U>
X<T>::Y<U>::~Y()
{
cout << "X<T>::Y<U>::~Y()" << endl;
delete u;
}
int main()
{
X<int>* xi = new X<int>(10);
X<char>* xc = new X<char>('c');
xi->print();
xc->print();
delete xi;
delete xc;
}
出力
1 a
出力
X<T>::Y<U>::Y()
X<T>::Y<U>::Y()
10
99
X<T>::Y<U>::~Y()
X<T>::Y<U>::~Y()
ローカル クラスはメンバー テンプレートを持つことができません。