如何解决编译器枚举重新声明冲突 考虑以下C++枚举: enum Identity { UNKNOWN = 1, CHECKED = 2, UNCHECKED = 3 }; enum Status { UNKNOWN = 0, PENDING = 1, APPROVED = 2, UNAPPROVED = 3 };
编译器冲突了两个如何解决编译器枚举重新声明冲突 考虑以下C++枚举: enum Identity { UNKNOWN = 1, CHECKED = 2, UNCHECKED = 3 }; enum Status { UNKNOWN = 0, PENDING = 1, APPROVED = 2, UNAPPROVED = 3 };,c++,enums,compiler-errors,enumeration,redeclaration,C++,Enums,Compiler Errors,Enumeration,Redeclaration,编译器冲突了两个未知项,并引发了以下错误: 错误:重新声明“未知” 我可以将未知中的一个更改为未知来解决此错误,但我不想更改名称 如何在不更改enum项目名称的情况下解决此冲突?使用作用域enums(C++11)enum类es。它们不会用重复的名称污染外部范围 但是,您需要使用范围解析运算符访问枚举值-Identity::UNKNOWN,这不是一件坏事。您可以使用它。这需要C++11或更高版本的支持 enum class Identity { UNKNOWN = 1,
未知项,并引发了以下错误:
错误:重新声明“未知”
我可以将未知
中的一个更改为未知
来解决此错误,但我不想更改名称
如何在不更改enum
项目名称的情况下解决此冲突?使用作用域enum
s(C++11)
enum类
es。它们不会用重复的名称污染外部范围
但是,您需要使用范围解析运算符访问枚举值-Identity::UNKNOWN
,这不是一件坏事。您可以使用它。这需要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;
}
< P>如果使用C++ 11是不可行的(现在应该是,我的意思是,它已经是2015),考虑使用命名空间:
namespace Identity {
enum {
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED =3
};
}
namespace Status {
enum {
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED =3
};
}
但是,实际上,
enum类
要好得多。这就是我通常声明此类枚举的方式(如果我不需要更奇特的东西,比如自动将枚举名称转换为字符串、序列化/反序列化等):
在每个C++版本中都是工作的,也是类型安全的。名称空间也可以用来代替结构(但我通常使用结构)。@chris我知道。这是不简单使用
enum类
的问题之一。我的意思是,您仍然可以使用名称(enum value{/*…*/
)声明枚举,并像void foo(Identity::value)一样使用它们
,但您仍然失去了类型安全等优点。有趣的是,C++11通常不可行,尤其是在商业领域——例如,我工作的公司的许多客户仍然使用RHEL等旧系统,只要系统运行良好,就不想升级(在版本升级过程中遇到严重的不兼容是很常见的)。因此,C++11被禁止,所有的东西都必须在旧的编译器中构建。事实上,在我工作过的最后4家公司中,C++11都被禁止。我以前工作过的一家公司也在MSVC 6中建设:-)
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;