Как решить конфликт переопределения перечисления компилятора

Рассмотрим следующие перечисления C ++:

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

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

Компилятор противоречит обоим UNKNOWN предметы и выкинул эту ошибку:

ошибка: переопределение «НЕИЗВЕСТНО»

Я могу решить эту ошибку, изменив один из UNKNOWN в UNKNOWN_a, но я бы хотел не менять имена.

Как я могу решить этот конфликт без изменяя enum наименование предметов?

8

Решение

Ты можешь использовать перечисления в области видимости за это. Это требует поддержки 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;
}

Живой пример

17

Другие решения

Если использование 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 намного лучше.

4

Используйте объем enums (C ++ 11) — enum classэс. Они не будут загрязнять внешнюю область двойными именами.

Но вам нужно получить доступ к перечисленным значениям с помощью оператора разрешения области видимости — Identity::UNKNOWN, который не плохо

4

Вот как я обычно объявляю такие перечисления (если мне не нужно что-то более необычное, например, автоматическое преобразование имен перечислений в строки, сериализация / десериализация и т. Д.)

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 ++ и также является типобезопасным. Пространства имен также могут использоваться вместо структур (но я обычно использую структуры).

2
По вопросам рекламы [email protected]