-qtmplparse

C++ のみ

説明

このオプションは構文解析およびセマンティック検査をテンプレート定義 (クラス・テンプレート定義、関数本体、メンバー関数本体、および静的データ・メンバー初期化指定子) に適用するか、またはテンプレートのインスタンス生成にのみ適用するかを制御する。 コンパイラーは、テンプレート定義内の関数本体と変数初期化指定子を検査して、 エラー・メッセージまたは警告メッセージを生成することができます。

構文

構文図を読む構文図をスキップする                      .-no----.
>>- -q--tmplparse--=--+-warn--+--------------------------------><
                      '-error-'
 

サブオプションは以下の通りです。

no テンプレート定義を構文解析しません。 これにより、前のバージョンの VisualAge C++ および先行製品用に作成されたコードで発生するエラーの数を減らすことができます。 これがデフォルトです。
warn テンプレート定義を構文解析し、意味エラーの場合に警告メッセージを発行します。
error テンプレートのインスタンスが生成されない場合でも、 テンプレート定義内の問題をエラーとして扱います。

このオプションは、テンプレートのインスタンス化ではなく、テンプレート定義に適用されます。 このオプションの設定に関係なく、定義の外で問題が起こるとエラー・メッセージが生成されます。 例えば、以下のように構成体の構文解析またはセマンティック検査中にエラーが見つかると、必ずエラー・メッセージが生成されます。

例 1:

以下の例では、テンプレート・クラスはインスタンス化されていません。したがってコンパイルによって構文解析されず、また -qtmplparse=error オプションを使用しなければ、コンパイラーは構文エラーを検出しません。 ただし、 -qtmplparse=error を使用すると、テンプレート・クラスは構文解析され、コンパイラーはエラー・メッセージにフラグを立てます。

template <class A> struct container
{
   A a1;
   A foo1()      //syntax error
   int _data;
};

xlC -c -qtmplparse=error myprogram.cpp 

例 2:

以下の例では収容クラスのインスタンスが作成されないため、その行外 (out-of-line) メンバー定義は構文解析されません。-qtmplparse=error を使用しないと、コンパイラーは行外 (out-of-line) 定義とオリジナル定義の間のミスマッチに対してエラー・メッセージを発行しません。

template <class A> struct container
{
   void member(A a);
};

// error - this member is not declared in the struct container
template <class B> void container<B>::member()   {
}
xlC -c -qtmplparse=error myprogram.cpp 

注:
-qtmplparse=error を使用するかしないかに関係なく、クラスのインスタンスを作成しようとすると、コンパイラーがエラー・メッセージを発行します。

関連情報