如何解决编译器枚举重新声明冲突
How solve compiler enum redeclaration conflict
考虑以下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)。
相关文章:
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 新运算符分配的大小大于声明的大小.为什么
- 为什么我不能只用前向声明 c++ 声明类的静态成员?
- 垫子声明:声明尺寸和大小()不同
- 如何从构造函数声明新的私有变量?
- 使用具有新信号槽语法的Qt插件系统在接口类中声明信号
- 使用 basic_string 声明新类型的字符串
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- STD :: bad_alloc在声明新的int [n]时
- 了解函数错误的歧义新声明
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 使用模板在类中声明新函数
- 元编程:动态声明一个新结构
- 使用括号会在声明新节点时会产生错误
- QT应用程序声明新对象后崩溃
- 新声明在使用delete时包含垃圾值和堆损坏
- 为什么新运算符没有声明为 [[nodiscard]]?
- 您只是调用前方声明和原型声明“声明”
- C++:友元声明'声明一个非模板函数
- C++在新函数声明器语法中访问此