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

时间:2015-12-16 18:37:41

标签: c++ enums compiler-errors enumeration redeclaration

考虑以下C ++枚举:

enum Identity
{
    UNKNOWN   = 1,
    CHECKED   = 2,
    UNCHECKED = 3
};

enum Status
{
    UNKNOWN    = 0,
    PENDING    = 1,
    APPROVED   = 2,
    UNAPPROVED = 3
};

编译器对两个UNKNOWN项冲突并抛出此错误:

  

错误:重新声明'UNKNOWN'

我能够解决此错误,将UNKNOWN之一更改为UNKNOWN_a,但我不想更改名称。

如何解决此冲突更改enum项目名称?

4 个答案:

答案 0 :(得分:17)

您可以使用scoped enumerations。这需要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;
}

Live Example

答案 1 :(得分:4)

使用范围enum s(C ++ 11) - enum class es。它们不会污染具有重复名称的外部范围。

但是,您需要使用范围解析运算符Identity::UNKNOWN来访问枚举值,这是一件坏事。

答案 2 :(得分:4)

如果使用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要好得多。

答案 3 :(得分:2)

这就是我通常会声明这些枚举的方式(如果我不需要更多花哨的东西,比如将枚举名称自动转换为字符串,序列化/反序列化等):

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 ++版本,也是类型安全的。也可以使用命名空间代替结构(但我通常使用结构)。