Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Два enum с одинаковыми значениями


Автор: RastaDja 19.7.2013, 11:17
Доброго времени суток!
Подскажите, как определить два перечисления с одинаковой константой в одном файле

Код

enum FooState
{
    NONE,
    Foo1,
    Foo2
};

enum BarState
{
    NONE,
    Bar1
};


Получаю ошибку error C2371: 'NONE' : redefinition; different basic types

Спасибо

Автор: ChipNDale 19.7.2013, 11:56
1. Использовать namespace.
2. Использовать enum class.
3. Использовать разные имена.

Автор: NoviceF 19.7.2013, 14:43
Цитата(ChipNDale @  19.7.2013,  12:56 Найти цитируемый пост)
1. Использовать namespace.
2. Использовать enum class.
3. Использовать разные имена. 


со всем согласен, но enum class есть только начиная с c++11, возможно, автору это не подходит.

Автор: Dem_max 19.7.2013, 19:57
1. Использовать namespace.

Автор: borisbn 20.7.2013, 07:59
Сорри за небольшой  smile 
Но я накушался с этими enum class'ами..
По любому чиху их нужно явно приводить к int'у...
Код
enum class E { a, b, max };
const char * e_names[ static_cast< int >( E::max ) ] = { ...
cout << e_names[ static_cast< int >( E::a ) ]; 

То же самое при сеарилизации...
Код становится только хуже читаемым.
Так что я тоже за namespace

Автор: volatile 20.7.2013, 11:11
 smile 
Цитата(borisbn @  20.7.2013,  07:59 Найти цитируемый пост)
По любому чиху их нужно явно приводить 

любителям Ады это должно понравицца... smile 

Автор: dershokus 23.7.2013, 11:00
Код

enum FooState
{
    FooState_NONE,
    FooState_Foo1,
    FooState_Foo2
};
enum BarState
{
    BarState_NONE,
    BarState_Bar1
};


Вот так можно smile

Код

enum FooBarState
{
    NONE=0,
    Foo1=1,
    Foo2=2,
    Bar1=1,
};

или так

Автор: boostcoder 23.7.2013, 15:54
Цитата(borisbn @  20.7.2013,  07:59 Найти цитируемый пост)
По любому чиху их нужно явно приводить к int'у...

ну...оно вроде как для этого и придумывалось, чтоб победить неявное преобразование.

Цитата(borisbn @  20.7.2013,  07:59 Найти цитируемый пост)
То же самое при сеарилизации...

просто, нужно "правильную" сериализацию использовать ;)
Код

enum class myenum { e1, e2 };
myenum e = myenum::e2;
yas::binary_mem_oarchive oa;
oa & e;

e = myenum::e1;
yas::binary_mem_iarchive ia(oa.get_intrusive_buffer());
ia & e;

assert(e == myenum::e2;);


Автор: borisbn 23.7.2013, 16:13
Цитата(boostcoder @  23.7.2013,  15:54 Найти цитируемый пост)
ну...оно вроде как для этого и придумывалось, чтоб победить неявное преобразование.

Это-то да. И иногда это спасает, но иногда бесит. Лучше уж я буду пользоваться простыми enum'ами и включу параноидальный уровень warning'ов.

Цитата(boostcoder @  23.7.2013,  15:54 Найти цитируемый пост)
просто, нужно "правильную" сериализацию использовать

Не в моём случае - протокол передачи сообщений мне выдали снаружи (я должен был подключиться к другой системе)...

Но вообще-то, спасибо за https://github.com/niXman/yas.
Интересно, а как ты сериализацию для enum class'ов сделал ?

Автор: boostcoder 23.7.2013, 18:56
Цитата(borisbn @  23.7.2013,  16:13 Найти цитируемый пост)
как ты сериализацию для enum class'ов сделал ?

все просто.
underlying_type тип либо указывается вручную(для enum class), либо выводится компилятором в зависимости от максимального значения перечеслителя.
поэтому, при бинарной сериализации, нужно хранить пару: left:'size of enum', right:'raw data'
собственно https://github.com/niXman/yas/blob/master/include/yas/serializers/binary/utility/pod_serializers.hpp#L47, и https://github.com/niXman/yas/blob/master/include/yas/serializers/binary/utility/pod_serializers.hpp#L64.


Автор: RastaDja 30.7.2013, 16:40
Цитата(dershokus @ 23.7.2013,  12:00)
Код

enum FooState
{
    FooState_NONE,
    FooState_Foo1,
    FooState_Foo2
};
enum BarState
{
    BarState_NONE,
    BarState_Bar1
};


Вот так можно smile

Использовал именно этот вариант. Спассибо за советы всем кто отписался.

Автор: Alca 30.7.2013, 16:49
Код

    enum ExStandartExt
        /// standard extension
    {
        seExe,  ///< execute module
        seDll,  ///< dynamically linked shared library
        seLib,  ///< static library
        seObj,  ///< object file
        seShell ///< shell script file
    };

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)