Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决编译器枚举重新声明冲突 考虑以下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 - Fatal编程技术网

如何解决编译器枚举重新声明冲突 考虑以下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;