如何避免C++中具有相同名称的两个枚举值的名称冲突?

byt*_*e77 14 c++ enums

C++中的枚举有一个主要问题:你不能在两个不同的枚举中有一个名字,如下所示:

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

enum OS
{
    None = 0,
    XP = 1,
    Windows7 = 2
}
Run Code Online (Sandbox Code Playgroud)

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

iam*_*ind 30

在C++ 03中,您可以将其包含enumstruct:

struct Browser
{
  enum eBrowser
  {
    None = 0,
    Chrome = 1,
    Firefox = 2
  };
};
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,使它成为enum class:

enum class Browser
{
    None = 0,
    Chrome = 1,
    Firefox = 2
};
Run Code Online (Sandbox Code Playgroud)

在C++ 03中namespace也可以包装,但我个人觉得包装struct/ class更好,因为namespace更广泛.例如

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

// file2.h
namespace X
{
  enum D { OK };
}
Run Code Online (Sandbox Code Playgroud)

  • @Pubby:你可以在`struct`上专门化模板. (4认同)

jua*_*nza 12

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

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

namespace Bar {
  enum OS {
      None = 0,
      XP = 1,
      Windows7 = 2
  }
}
Run Code Online (Sandbox Code Playgroud)

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

enum class Browser { ... }
enum class OS { ... }
Run Code Online (Sandbox Code Playgroud)

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