Согласно GCC C ++ 11 поддержка статуса сайта, строго типизированные перечисления доступны для g++4.4
и больше.
Однако следующее не компилируется с g++4.4
:
enum class Foo
{
value_1,
value_2
};
int main()
{
Foo a = Foo::value_1;
Foo b = Foo::value_2;
const bool test = ( a < b );
}
Сообщение об ошибке error: invalid operands of types ‘Foo’ and ‘Foo’ to binary ‘operator<’
,
Компиляторы, которые принимают код, включают g++-4.6
, g++-4.7
, g++-4.8
а также clang++ 3.2
, (Я не мог проверить с g++-4.5
поскольку я не установил это в настоящее время (и Ubuntu 13 не хочет, чтобы я))
Я мог бы легко предоставить запасной вариант для этого (довольно старого) компилятора с помощью макроса, но мне это вообще не нравится (где он останавливается? …).
В чем здесь проблема? Является ли информация поддержки неверной или отсутствует другая часть, которая не включена в «поддержку строго типизированных перечислений»? Последний вариант, о котором я могу подумать: проблема в моем коде?
Это известен ошибка. Как выяснил @Casey, изначально g++-4.4
не поддерживал никакие реляционные операции над строго типизированными перечислениями. За равенство, это было исправлено в версии 4.4.1
, но исправить для всех других отношений, таких как <
а также >
только сделал это в 4.5.1
и выше.
Это оригинальная ветка об ошибке в gcc bugzilla: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064
Других решений пока нет …