考虑以下C ++枚举:
enum Identity
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED = 3
};
enum Status
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED = 3
};
编译器对两个UNKNOWN
项冲突并抛出此错误:
错误:重新声明'UNKNOWN'
我能够解决此错误,将UNKNOWN
之一更改为UNKNOWN_a
,但我不想更改名称。
如何解决此冲突不更改enum
项目名称?
答案 0 :(得分:17)
您可以使用scoped enumerations。这需要C ++ 11或更高版本的支持。
enum class Identity
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED =3
};
enum class Status
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED =3
};
int main ()
{
Identity::UNKNOWN;
Status::UNKNOW;
}
答案 1 :(得分:4)
使用范围enum
s(C ++ 11) - enum class
es。它们不会污染具有重复名称的外部范围。
但是,您需要使用范围解析运算符Identity::UNKNOWN
来访问枚举值,这不是一件坏事。
答案 2 :(得分:4)
如果使用C ++ 11不可行(我的意思是,现在它已经是2015年了),请考虑使用命名空间:
namespace Identity {
enum {
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED =3
};
}
namespace Status {
enum {
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED =3
};
}
但是,真的,enum class
要好得多。
答案 3 :(得分:2)
这就是我通常会声明这些枚举的方式(如果我不需要更多花哨的东西,比如将枚举名称自动转换为字符串,序列化/反序列化等):
struct Identities
{
enum Type
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED = 3
};
};
typedef Identities::Type Identity;
struct States
{
enum Type
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED = 3
};
};
typedef States::Type Status;
// usage
Identity identity = Identities::UNKNOWN;
Status status = States::UNKNOWN;
适用于每个C ++版本,也是类型安全的。也可以使用命名空间代替结构(但我通常使用结构)。