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
};
}