【问题标题】:enum in a namespace命名空间中的枚举
【发布时间】:2011-10-28 17:47:51
【问题描述】:

这样做有没有意义:

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

【问题讨论】:

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


    【解决方案1】:

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

    namespace status {
      void error( const char *msg );
    }
    

    由于函数 error 与您的 enum 值冲突,您会收到编译器错误。

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

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

    这让我可以编写类似的函数

    void handleMouseButton( MouseButton::Value b ) {
      switch ( b ) {
        case MouseButton::Left:   // ...
        case MouseButton::Middle: // ...
        case MouseButton::Right:  // ...
      }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      有了这样的声明,你可以写:

      status::value var = status::ok;
      

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

      【讨论】:

      • 另外,此解决方案允许您将枚举声明嵌套在类或结构中,这是使用命名空间无法实现的。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        两者都很好,这是您认为更具可读性的内容。注意你也可以使用(没有namespace

        enum status{
           ok,
           error
        }
        

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

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

        【讨论】:

        • 不,这是一个错误。编译器说status 必须是命名空间或类/结构。
        • 我用 g++、icc、icpc 对其进行了测试,确实会引发错误。但是,使用 MS VS2010 可以正常编译。我在想我正在编写很好的可移植代码;)
        • 在 C++03 中它是一个非标准的 MSVC 扩展,但在 C++11 中它是标准的。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-10-18
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          相关资源
          最近更新 更多