クラス テンプレートの既定の引数
クラス テンプレートは、型または値パラメーターの既定の引数を指定できます。 既定の引数は、等値記号 (=) の後に型名または値を指定します。 テンプレート引数が複数ある場合、最初の既定の引数の後は、すべての引数に既定の引数が必要です。 既定の引数を持つテンプレート クラス オブジェクトを宣言する場合、既定の引数を受け入れるには、引数を省略します。 既定の引数以外に引数がない場合は、空の山かっこを省略しないでください。
重複して宣言されるテンプレートでは、既定の引数を複数回指定することはできません。 エラーのコード例を次に示します。
template <class T = long> class A;
template <class T = long> class A { /* . . . */ }; // Generates C4348.
使用例
次の例では、配列クラス テンプレートが、配列要素の既定の型 int と、サイズを指定するテンプレート パラメーターの既定値付きで定義されています。
// template_default_arg.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
template <class T = int, int size = 10> class Array
{
T* array;
public:
Array()
{
array = new T[size];
memset(array, 0, size * sizeof(T));
}
T& operator[](int i)
{
return *(array + i);
}
const int Length() { return size; }
void print()
{
for (int i = 0; i < size; i++)
{
cout << (*this)[i] << " ";
}
cout << endl;
}
};
int main()
{
// Explicitly specify the template arguments:
Array<char, 26> ac;
for (int i = 0; i < ac.Length(); i++)
{
ac[i] = 'A' + i;
}
ac.print();
// Accept the default template arguments:
Array<> a; // You must include the angle brackets.
for (int i = 0; i < a.Length(); i++)
{
a[i] = i*10;
}
a.print();
}