2013-10-09 52 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)。 –