命名空间中的枚举

时间:2011-08-17 08:53:21

标签: c++ enums namespaces c++11

有没有做这样的事情:

namespace status{
  enum status{
    ok,
    error
  };
}

并像status::ok

一样使用它

或者我应该这样做:

enum status{
  status_ok,
  status_error
};

并像status_ok一样使用它?

更新 使用C ++ 11,您现在应该这样做:

enum class status {
    ok,
    error
};

并使用如下:status::ok

5 个答案:

答案 0 :(得分:21)

我个人不喜欢第二种变体,因为status_部分对我来说似乎是多余的。前一个版本避免了这个问题,但是类型status::status看起来也很奇怪。此外,命名空间可以修改,所以如果有人做了像

这样的事情
namespace status {
  void error( const char *msg );
}

由于函数errorenum值冲突,您将收到编译器错误。

我更喜欢使用第三种变体:

struct MouseButton {
  enum Value {
    Left, Middle, Right
  };
};

这让我可以编写像

这样的函数
void handleMouseButton( MouseButton::Value b ) {
  switch ( b ) {
    case MouseButton::Left:   // ...
    case MouseButton::Middle: // ...
    case MouseButton::Right:  // ...
  }
}

答案 1 :(得分:7)

在启用C ++ 0x扩展时,您刚想要添加到C ++中。但是,如果您不能使用C ++ 0x功能,我建议这样做:

struct status
{
    enum value
    {
        ok,
        error
    };
};

通过这样的声明你可以写:

status::value var = status::ok;

这样的结构还允许您在struct范围内声明与状态类型相关的函数。例如,状态struct可以包含转换为字符串的方法。

答案 2 :(得分:3)

如果您不担心使用enum status类型,那么您可以保持匿名。

namespace status{
  enum {  // <--- no name
    ok,
    error
  };
}

答案 3 :(得分:1)

首先,您应该使用范围运算符enum而不是点::运算符访问.;即status::ok

两者都很好,你觉得它更具可读性。请注意,您也可以使用(不使用namespace

enum status{
   ok,
   error
}

仍然使用status::ok,但有些编译器会警告您额外的status::是不必要的。

编辑:使用enum访问::似乎只适用于MS visual-c ++

答案 4 :(得分:0)

我更喜欢命名空间方法,因为它允许using namespace并使用较短的枚举值,如果在一段代码中只使用了一个枚举。

这主要是个人偏好的问题,但是,我认为在C ++中解决(潜在的)名称冲突最好使用命名空间来完成,因为这首先是拥有命名空间。