如何解决编译器枚举重新声明冲突

How solve compiler enum redeclaration conflict

本文关键字:新声明 声明 冲突 编译器 何解决 解决 枚举      更新时间:2023-10-16

考虑以下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;
}

实时示例

使用作用域enums(C++11)-enum classes。它们不会用重复的名称污染外部作用域。

但是,您需要使用范围解析运算符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)。