6

コード内のいくつかの場所で列挙型の使用を開始したいのですが、コンパイラからの以前の宣言に問題があります。列挙型が現在どのように宣言されているかは、私にとって最も理にかなっています。

このような状況を回避する最善の方法は何ですか?

enum score_methods_t {NONE,ABS_FROM_PERFECT,ERROR_SQUARED};
enum scale_methods_t {NONE,CASES_MULTIPLIER,RANGE_MULTIPLIER};

すべてを一意にするか、名前空間でスコープする必要がありますか? クラス内で列挙型を使用したいのですが、NONE が最もわかりやすい名前です。

また、列挙型が衝突する理由は、本質的にはフードの下の #defines に過ぎないからですか??

4

2 に答える 2

11

C++11 より前の時代には、以下を使用していました。

struct score_methods { enum type { NONE, ABS_FROM_PERFECT, ERROR_SQUARED }; };

score_methods::typeつまり、実際のenum型には常に がありscore_methods::NONE、値には などがあります。

#defineまた、いいえ、それらは異なる名前空間またはクラスに配置できるため(上​​記のように)、単なるs ではありません。これは、プリプロセッサが実行/処理できないものです。

于 2013-10-09T23:02:18.697 に答える
5

列挙型はいつでもクラスに入れることができます。

struct Score
{
     enum Method { None, AbsFromPerfect, ErrorSquared };
};

使用法:

void foo(Score::Method m);

foo(Score::None);
于 2013-10-09T23:01:57.220 に答える