2013-10-09 12 views
5

私はコード内のいくつかの場所でenumを使用したいと思っていますが、コンパイラの以前の宣言に問題があります。現在のところenumがどのように宣言されているのですか。スコープ付き列挙型のベスト代替 - Pre C++ 11

このような状況を避けるにはどうすればよいでしょうか?

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

すべてを一意にするか、名前空間で有効にするか私はクラス内で列挙型を使用したいと思いますし、NONEは最も記述的な名前です!

また、enumsの衝突は、本質的にthayがフードの中でちょうど#defineなので、なぜですか?

答えて

10

を、私が使用:

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

実際にはenumタイプの場合はscore_methods::type、タイプがscore_methods::NONEの場合はfまたは値。

また、別の名前空間やクラス(上記参照)に入れることができるので、それらはプリプロセッサでは処理/処理できないものであるため、ただ#defineではありません。

+0

このアプローチを使用すると、変数、クラスメンバー、関数型のenum型の引数をどのように宣言しますか? – ulidtko

+0

@ulidtko 'score_methods :: type'のように' :: type'を使用しています。これは、プレC++ 11で支払う価格です。 :) –

+0

うん...同じ列挙型の 'score_methods :: value'メンバーを宣言し、暗黙的な構造体代入演算子をいくらか使うことができますか?それは私にとってより安全な型セーフな方法です。 – ulidtko

4

あなたはいつもクラスで列挙型を置くことができます。

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

使用方法:事前C++ 11倍で

void foo(Score::Method m); 

foo(Score::None); 
+0

これは 'enum class'と同じ型セーフではありません。私。 'foo(15)'のような型エラーはtypecheckしてコンパイルするだけです。 – ulidtko

+0

@ulidtko:いいえ、列挙型の通常の変換ルールのため、[コンパイルできません](http://ideone.com/6wWorj) –

関連する問題