型内で列挙型を使用する-コンパイラ警告C4482C ++
-
21-08-2019 - |
質問
クラスの1つのメソッド内で列挙型の完全修飾名を使用しています。しかし、「警告C4482:非標準の拡張子が使用されています:列挙型 'Foo'が修飾名で使用されています」というコンパイラの警告が表示されます。C ++では、修飾名なしで列挙型を使用する必要がありますか?しかし、IMO、それは醜いようです。
何か考えはありますか?
解決
はい、列挙型は新しい「名前空間」を作成しません。列挙型の値は、周囲のスコープで直接利用できます。だからあなたは得る: ジェネラコディセタグプレ
他のヒント
きれいにするには、以下を交換してください: ジェネラコディセタグプレ
with ジェネラコディセタグプレ
sthは質問に答えますが、私がいつも列挙型をどのように使用してきたかについては触れていませんでした。それらは多かれ少なかれ数字の名前ですが、私は常に特定の値しか持てない型を定義するためにそれらを使用してきました。
列挙型がクラスの一部である場合、それは消費者が列挙型参照を明確に識別するのに役立ちます: ジェネラコディセタグプレ
その後、コンシューマーは列挙型のインスタンスを宣言し、パラメーターとして渡し、タイプの1つを参照するときにそれらを修飾することができます。 ジェネラコディセタグプレ
クラス外の列挙型または同じクラス内の2つの列挙型が必要な場合があり、Poyが持っていたようなことを行うことができます。ただし、列挙型を参照することはできないので、名前を付けるだけです。 ジェネラコディセタグプレ
列挙型と値を使用すると、次のように機能します。 ジェネラコディセタグプレ
これで、同じ名前の異なる列挙型が存在する場合、それらは常にそれらがどのタイプであるかで修飾されます。そうすれば、ギャンブラーが求めていることを処理できます。 ジェネラコディセタグプレ
はい。概念的には、列挙型は型とその型の可能な値を定義します。当然のように思えますが、enum foo { bar, baz };
を定義してから、foo::baz
を参照することは、int::1
を参照することと同じです。
これはGCCとMSコンパイラおよびMacで動作します。また、名前空間演算子を使用して競合を渡すことができるという利点があります。少し不利な点は、Fruitの代わりにFruit :: Valueを記述しなければならないことです。他のクラスの列挙型がわからない大規模なプロジェクトでより役立ちます。
代わりにC ++ 11を使用できる場合は、enum :: namespace構文が可能になるため、はるかに簡単です。
これを行うために私が見つけた最もクリーンな方法は、列挙型をそのように定義することです ジェネラコディセタグプレ
次に、関数と変数の定義でtypedefを使用できます: ジェネラコディセタグプレ
.cppファイルでは、名前空間を使用して変数を割り当てることができます。 ジェネラコディセタグプレ
個人的には、これはコンパイラのバグだと思います。私は長い間C ++を使用してきました。残念ながら、OPにはサンプルコードがありません。ジャワの人々による列挙型の解釈は、実際には正しいiMOでした。私の、こんな感じでした... ジェネラコディセタグプレ
Foo :: tMyEnum :: eFirstValも試してみました。修飾子がないと、すべてがコンパイルされます。
同じ問題が発生しましたが、まだC ++ 11を使用していません。私自身も完全修飾名前空間を好みます。
この特定の警告を無効にしました。きっと人々はそのアイデアを嫌うでしょうが、感謝する人もいるかもしれません。 ジェネラコディセタグプレ