このページはC++11に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
テンプレート内で、テンプレートパラメータに依存する名前を使用する場合には、typename
キーワードを先頭に付ける必要がある。
テンプレート内で、推論できないテンプレートパラメータを持つメンバ関数を呼び出す場合には、メンバ関数名の前にtemplate
キーワードを付ける必要がある。
C++03まで、テンプレート外でtypename
とtemplate
を付けるとコンパイルエラーになっていたが、C++11では、テンプレート外でtypename
とtemplate
を付けることが許可された。
これは、テンプレート内とテンプレート外で、共通のコードを利用できるようにするためである。
例
#include <vector>
struct X {
template <int N>
int get() const
{
return N;
}
};
int main()
{
typename std::vector<int>::iterator it; // OK
int value = X().template get<3>(); // OK
}
出力