2013-10-09 47 views
5

我想在我的代碼中的幾個地方開始使用枚舉,但是我對編譯器以前的聲明有問題。目前聲明的枚舉如何對我最有意義:範圍枚舉的最佳替代方法 - Pre C++ 11

避免這種情況的最佳方法是什麼?

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

我應該讓所有的東西都是唯一的,還是使用命名空間作用域?我想在類中使用枚舉類型,而NONE是最具描述性的名字!

也是原因的枚舉衝突是因爲本質上只是#defines在引擎蓋下?

回答

10

在預C++ 11次,我用:

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

這意味着對於實際的enum類型和score_methods::NONE等,始終有score_methods::type f或值。

此外,不,它們不只是#define s,因爲您可以將它們放到不同的名稱空間或類中(如上所示),這是預處理器無法處理/處理的內容。

+0

使用這種方法,你如何聲明枚舉類型的變量,類成員,函數參數? – ulidtko

+0

@ulidtko使用':: type',如'score_methods :: type'中的。這是您在C++ 11之前付出的代價。 :) –

+0

是啊......我們可以聲明一個相同枚舉類型的'score_methods :: value'成員,並使用隱式結構賦值運算符嗎?這對我來說看起來更安全。 – ulidtko

4

您可以隨時把枚舉類中:

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

用法:

void foo(Score::Method m); 

foo(Score::None); 
+0

這不像'enum class'那樣安全,對不對?即像'foo(15)'這樣的類型錯誤會被檢測並編譯得很好。 – ulidtko

+0

@ulidtko:不,因爲通常的枚舉轉換規則,[不會編譯](http://ideone.com/6wWorj)。 –