Рассмотрим следующие перечисления 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;
}
Если использование 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
намного лучше.
Используйте объем enum
s (C ++ 11) — enum class
эс. Они не будут загрязнять внешнюю область двойными именами.
Но вам нужно получить доступ к перечисленным значениям с помощью оператора разрешения области видимости — Identity::UNKNOWN
, который не плохо
Вот как я обычно объявляю такие перечисления (если мне не нужно что-то более необычное, например, автоматическое преобразование имен перечислений в строки, сериализация / десериализация и т. Д.)
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 ++ и также является типобезопасным. Пространства имен также могут использоваться вместо структур (но я обычно использую структуры).