テンプレート本体の解析

提供: Appmethod Topics
移動先: 案内検索

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);
 };



以前のバージョンのコンパイラでは,セミコロンがなくても問題ありませんでしたが,このバージョンではすべてのテンプレート定義の最後にセミコロンを付けなければなりません。

関連項目