テンプレート本体の解析
C++ の仕様:インデックス への移動
以前のバージョンのコンパイラでは,テンプレートがインスタンス化されない限り,テンプレート本体の構文はチェックされませんでしたが,現在ではテンプレート本体は,ほかの宣言のように見つかるとすぐに解析されます。
template <class T> class X : T
{
Int j; // エラー。テンプレート X<T> で予想される型名
};
Int がまだ定義されていないと仮定します。この場合,Int はテンプレート引数 T のメンバーであることを意味します。ただしそれはタイプミスであって,Int ではなく int でなければならない可能性もあります。コンパイラでは正しい意味をつかめないので,エラーメッセージが発行されます。
テンプレート引数によって定義される型にアクセスする場合は,typedef を使ってコンパイラにその意図を明確に伝えなければなりません。
template <class T> class X : T
{
typedef typename T::int int;
Int j;
};
以前のバージョンのコンパイラのように,
typedef T::int;
と記述することはできません。以前は,typedef 名を与えなくてもかまいませんでしたが,このバージョンではエラーメッセージが発行されます。
テンプレート本体の内部で記述されるほかのすべてのテンプレートは,その時点で宣言または定義されます。したがって,次の例の書式は誤りであり,コンパイルされません。
template <class T> class X
{
void f(NotYetDefindedTemplate<T> x);
};
以前のバージョンのコンパイラでは,セミコロンがなくても問題ありませんでしたが,このバージョンではすべてのテンプレート定義の最後にセミコロンを付けなければなりません。