2013-07-19 12 views
5

Zgodnie z GCC C++11 support status website, silnie typowane wyliczenia są dostępne dla g++4.4 i więcej.Silnie typowane wyliczenia w g ++ - 4.4

Jednak dodaje się nie kompiluje z 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); 
} 

Komunikat o błędzie jest error: invalid operands of types ‘Foo’ and ‘Foo’ to binary ‘operator<’.

Kompilatory, które akceptują kod, to: g++-4.6, g++-4.7, g++-4.8 i clang++ 3.2. (Nie mogłem przetestować z g++-4.5, ponieważ nie mam go obecnie zainstalowanego (i Ubuntu 13 nie chce, żebym to zrobił))

Mogłabym łatwo zapewnić awarię dla tego (raczej starego) kompilatora z makrem, ale generalnie mi się to nie podoba (gdzie to się kończy? ...).

Na czym polega problem? Czy informacje na temat wsparcia są błędne lub brakuje innego elementu, którego nie uwzględniono w sekcji "Obsługa wyrażeń napisanych ściśle"? Ostatnia opcja, którą mogę wymyślić: Czy problem występuje w moim kodzie?

+0

kodu produkcyjnego, moje zalecenie byłoby nie skorzystać C++ 11 funkcje w wersjach przed co najmniej 4,7, a korzystnie nie przed 4.8. Jeśli nalegasz na obsługę wielu wersji kompilatorów * i * chcesz korzystać z funkcji C++ 11, szybko stajesz się opiekunem baz danych błędów g ++. Ubuntu 13 dostarcza g ++ 4.7 po wyjęciu z pudełka i jest ppa na g ++ 4.8 – TemplateRex

+0

Cóż, działa dobrze, z wyjątkiem tego małego kawałka. Wiem, że wolałbym mieć pętle bazujące na zasięgu, ale jest to kompromis pomiędzy przyjemnymi funkcjami i kompatybilnością. – stefan

+2

+1 za samodzielny przykład i wysiłek badawczy. Niestety wydaje się, że jest to wyjątek dla pytań SO. – juanchopanza

Odpowiedz

2

Jest to znany błąd znany pod nazwą. Jak się dowiedział @Casey, pierwotnie g++-4.4 nie obsługiwał żadnych operacji relacyjnych na podstawie wyrażeń mocno napisanych. W przypadku równości zostało to naprawione w wersji 4.4.1, ale poprawka dla wszystkich innych relacji, takich jak < i >, przekształciła się tylko w 4.5.1 i nowszą.

Oryginalny wątek błąd na Bugzilli gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064

Powiązane problemy