FAQ

QA・C/QA・C++

QA・C++ 特有のFAQ

ID.

Q. <列挙体名>::<列挙子名>; という形式の構文は解析できないのでしょうか? QAC++2.3.1J以下

A.


ISO C++違反の構文であるため解析することができません。ただし、QAC++2.3.1Jの次バージョンからは解析することができます。理由は次の通りです。

ISO C++言語規格書の7.2-10には次のように記されています。

<<列挙体名>> 及び 列挙体指定子によって宣言された各列挙子は, その列挙体 指定子を直接に含む有効範囲の中で宣言される。これらの名前は, すべての 名前に対する有効範囲規則(3.3及び3.4参照)に従う。クラス有効範囲内で 宣言された列挙子は, そのクラスのメンバアクセス演算子(::, . 及び ->) を使って参照することができる(5.2.5参照)。具体的には、次のようなクラスと列挙体を定義した場合、 class CTest { public: enum ENUM_TEST { ETEST1, ETEST2 }; };次の構文は正しい構文になります。 void func1(void) { CTest::ENUM_TEST ent = CTest::ETEST1; }しかし、列挙体名(ENUM_TEST)は有効範囲を構成する要素には成り得ないので、次の構文は間違った構文になります(赤太字の部分が問題です)。 void func2(void) { CTest::ENUM_TEST ent = CTest::ENUM_TEST::ETEST1; }QA C++はISO C++に従って前者の構文をエラーとして扱います(該当箇所には400番の警告が出力されます)。
"<列挙体名>::"を記述した場合と記述しなかった場合とで文法的な意味は変わらないので、恐れ入りますが、ソースコード側を修正して解析できるようにしてください。

<< QA・C++ 特有のFAQに関するFAQ一覧へ戻る