考虑以下C++枚举:
enum Identity
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED = 3
};
enum Status
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED = 3
};
编译器与两个UNKNOWN
项冲突,并引发以下错误:
错误:重新声明"未知"
我可以解决这个错误,将其中一个UNKNOWN
更改为UNKNOWN_a
,但我不想更改名称。
如何在不更改enum
项目名称的情况下解决此冲突?
您可以为此使用作用域枚举。这需要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;
}
实时示例
使用作用域enum
s(C++11)-enum class
es。它们不会用重复的名称污染外部作用域。
但是,您需要使用范围解析运算符Identity::UNKNOWN
来访问枚举值,这不是一件坏事。
如果使用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
要好得多。
这就是我通常声明此类枚举的方式(如果我不需要更花哨的东西,比如枚举名称自动转换为字符串、序列化/反序列化等):
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++版本,并且是类型安全的。命名空间也可以用来代替structs(但我通常使用structs)。