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

时间:2012-06-03 11:08:54

标签: c++ enums

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

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

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

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

5 个答案:

答案 0 :(得分:29)

在C ++ 03中,您可以将enum括在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 ++ 03中namespace也可以被包装,但我个人觉得包裹struct / class更好,因为namespace更广泛。 e.g。

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

// file2.h
namespace X
{
  enum D { OK };
}

答案 1 :(得分:12)

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

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

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

如果编译器可以使用,更好的选择是使用C ++ 11 enum classes

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

有关枚举类的讨论,请参阅here

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

Browser::None != OS::None   

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

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

答案 4 :(得分:1)

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

enum class Browser : <type> {

};

enum class OS : <type> {

};

通过浏览器的对象或OS的对象访问枚举类型。