C++ 多个枚举中的相同名称

C++ 多个枚举中的相同名称,c++,C++,我有几个enum具有相同的字段名: enum Response { Ok = 0, Busy = 1 } enum Status { Ok = 0, LoggedOut = 1 } 这会产生以下错误: 错误:重新声明“确定” 你如何解决这个问题 UPD 正在尝试使用枚举类: enum class Response { Ok = 0, Busy = 1 } Status s1 = Status::Ok ; 出现错误: Error: 'Status' is not

我有几个
enum
具有相同的字段名:

enum Response
{
  Ok = 0, 
  Busy = 1
}

enum Status
{
  Ok = 0, 
  LoggedOut = 1
}
这会产生以下错误:

错误:重新声明“确定”

你如何解决这个问题

UPD

正在尝试使用枚举类:

enum class Response
{
  Ok = 0, 
  Busy = 1
}
Status s1 = Status::Ok ;
出现错误:

Error: 'Status' is not a class or namespace
     Status s1 = Status::Ok ;
                 ^

我会切换到使用
enum类

enum class Response
{
  Ok = 0, 
  Busy = 1
};

enum class Status
{
  Ok = 0, 
  LoggedOut = 1
};
然后可以引用
enum
值而不产生歧义

Status s = Status::Ok;

我使用的另一个解决方案是C++11之前的版本:

struct Responses
{
  enum type {
    Ok = 0,
    Busy = 1
  };
};

typedef Responses::type Response;

struct States
{
  enum type {
    Ok = 0, 
    LoggedOut = 1
  };
};

typedef States::type Status;
然后将枚举称为:

Response r1 = Responses::Ok;
Response r1 = Responses::Busy;
Status s1 = States::Ok;
Status s2 = States::LoggedOut;

<> >问题是因为C++中的代码> EnUM <代码>没有定义命名空间,而是一个常数,它可以隐式转换为<代码> int <代码>。因此,您的代码类似于编写:

int Ok = 0;
int Busy = 1;

int Ok = 0;
int LoggedOut = 1;
当然,这会产生冲突。您可以采取三种可能的方法来解决此问题,其中第一种是最理想的方法,但如果您因某种原因无法使用,则其他方法是可能的替代方法:

(1)如果你可以使用C++ 11的特性——你应该能够使用的——你可以用更新的<代码> EnUM类< /C>代替<代码> EnUM <代码>。它定义了一个单独的名称空间,并且是强类型的,阻止您将不同的枚举混合在一起(有关更多信息,请参阅)。e、 g

您现在需要以限定范围的方式引用此值,例如
Status::Ok
Response::Busy

(2) 您可以更改名称以包括枚举名称:

enum Response
{
    Response_Ok = 0, 
    Response_Busy = 1
};
(3) 您可以将枚举本身封装在命名空间中:

 namespace Status
 {
     enum Status
     {
         Ok = 0,
         LoggedOut = 1
     };
 }

在枚举或更新的C++11枚举(枚举类)周围使用命名空间:)请不要根据得到的答案编辑问题。我觉得问题之前的答案是可以的(即使是被愚弄的),但是使用UDP(这到底意味着什么?)会让人困惑,答案也与你的问题不匹配。第二个好处是它们是正确的类型,所以如果你有
Foo(Response e e)
,在OP的示例中,您可以在那里传递任何
enum
int
,而使用
enum class
您可以“t错误
'Status'不是类或命名空间Status s s=Status::Ok^
Get error
状态不是类或命名空间
有关UPD的更多详细信息body@vico在这里工作:当
名称空间
就足够时,为什么要创建一个完整的
结构
。。。尽管结构阻止使用命名空间响应执行
;使用名称空间状态状态::Ok
传递给一个需要
响应的函数,因此如果有C++11,他们肯定更喜欢
枚举类
 namespace Status
 {
     enum Status
     {
         Ok = 0,
         LoggedOut = 1
     };
 }