15

C++ 中的枚举存在一个主要问题:不能在两个不同的枚举中使用一个名称,如下所示:

enum Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
}

enum OS
{
    None = 0,
    XP = 1,
    Windows7 = 2
}

那么在这个例子中处理这个问题的最佳方法是什么?

4

5 回答 5

31

在 C++03 中,您可以将其包含enum在 a 中struct

struct Browser
{
  enum eBrowser
  {
    None = 0,
    Chrome = 1,
    Firefox = 2
  };
};

在 C++11 中使其成为enum class

enum class Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
};

在 C++03namespace中也可以进行包装,但我个人认为 wrapping struct/class更好,因为namespace更广泛。例如

// file1.h
namespace X
{
  enum E { OK };
}

// file2.h
namespace X
{
  enum D { OK };
}
于 2012-06-03T11:11:16.693 回答
13

一种选择是将每个枚举放在不同的命名空间中:

namespace Foo {
  enum Browser {
      None = 0,
      Chrome = 1,
      Firefox = 2
  }
}

namespace Bar {
  enum OS {
      None = 0,
      XP = 1,
      Windows7 = 2
  }
}

如果您的编译器可用,更好的选择是使用 C++11枚举类

enum class Browser { ... }
enum class OS { ... }

有关枚举类的讨论,请参见此处。

于 2012-06-03T11:12:14.807 回答
3

将它们包装在命名空间或类中:

namespace Browser {
  enum BrowserType
  {
    None = 0,
    Chrome = 1,
    Firefox = 2
  }
}

namespace OS {
   enum OSType  {
      None = 0,
      XP = 1,
      Windows7 = 2
  }
}
于 2012-06-03T11:10:57.250 回答
2

您可以使用C++11 中支持的enum class( scoped enums )。它是强类型的,表示每种enum类型都不同。

Browser::None != OS::None   

enum class Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
}

enum class OS
{
    None = 0,
    XP = 1,
    Windows7 = 2
}
于 2014-11-07T15:12:57.530 回答
1

如何使用作用域与非作用域枚举?c++11 现在提供范围枚举。一个例子是:

enum class Browser : <type> {

};

enum class OS : <type> {

};

通过浏览器对象或操作系统对象访问枚举类型。

于 2013-01-28T01:15:47.387 回答