Następujące;
Nie jest akceptowana jako poprawna deklaracja w niektórych bieżących implementacjach (testowany kod ++, g ++ i MSVC). Nie akceptują one jeszcze niekompletnego typu E
, w enum-base enum-base . Błąd podany w testowanych implementacjach jest taki, że E
jest niezadeklarowany w tym punkcie. Wydaje się, że umieszczają punkt deklaracji na końcu enum-enum-base, uznają go za zadeklarowany, gdy jest kompletny.
Podczas czytania specyfikacji;
§14.3.1/2 Typ szablonu argumenty
[Uwaga: typ argumentu szablon może być niepełne rodzaju (3,9). - koniec Uwaga]
I
§7.2/6 zgłoszeń Wyliczenie
Wyliczenie którego Bazowy typ stałej jest niekompletny typu z punktu zgłoszenia (3.3.2) do zaraz po swojej enum-base (jeśli istnieje), w którym to momencie staje się pełnym typem.
Wskazuje na to, że jest on kompilowany; tak jak w przypadku implementacji CRTP.
Jestem pewien, że jeśli to (tj. Brak kompilacji enum class E : CL<E>::UndType;
) jest intencją lub jeśli zostało to uznane za przypadek użycia. Ze specyfikacji wynika, że deklaracja "enum" jest opatrzona pewnym "specjalnym" traktowaniem w.r.t. jego typ podstawowy i wymóg, że musi to być typ integralny.
Przypuszczalnie kod powinien być kompilowany, z uwzględnieniem rozdzielczości na CWG#1482.
Co do bieżących obejść ...
To;
enum class E; // default underlying type is int
Jest deklaracją minimalną.
Nieprzejrzysta deklaracja może być;
enum class E : int; // int base
Poniżej znajduje się pełna definicja (w tym moduły wyliczające);
enum class E : int {/*...*/};
Lub użyć szablonu klasy, można użyć innego typu (prawdopodobnie void
).
enum class E : CL<void>::UndType;
Powiedziałbym, że jest w ';' (przed '// error') deklaracji * opaque-enum *. – Jarod42
Tak więc w 'CL', 'E' nie jest jeszcze zadeklarowana :( –
Jarod42
Jarod42, ale dlaczego nie jest jeszcze zadeklarowana? Standard mówi, że jest zaraz po identyfikatorze, czyż nie? Nie rozumiem it – user3514538