型を参照する修飾名やテンプレート・パラメーターに依存する修飾名がある場合は、
キーワード typename を使用してください。
キーワード typename のみを、テンプレート宣言または定義で使用してください。
次の例は、キーワード typename の使用法を示しています。
template<class T> class A { T::x(y); typedef char C; A::C d; }
ステートメント T::x(y) は、あいまいです。 そのステートメントは、非ローカル引き数 y を使用した関数 x() の呼び出しや、 または、型 T::x を使用して変数 y の宣言にすることができます。 C++ は、このステートメントを関数呼び出しとして解釈します。 コンパイラーにこのステートメントを宣言として解釈させるには、 キーワード typename をそのステートメントの開始位置に追加します。 ステートメント A::C d; は、書式が不正です。 クラス A は、A<T> も参照するので、テンプレート・パラメーターに依存します。 キーワード typename をこの宣言の開始位置に追加する必要があります。
typename A::C d;
テンプレート・パラメーター宣言で、キーワード class の代わりに、 キーワード typename も使用できます。
関連参照