Das Folgende;
enum class E : CL<E>::UndType;
Wird in einigen aktuellen Implementierungen nicht als gültige Deklaration akzeptiert (getestet: clang ++, g ++ und MSVC). Sie akzeptieren den noch nicht vollständigen Typ E
in der enum-BaseCL<E>::UndType
nicht. Der in den getesteten Implementierungen angegebene Fehler ist, dass E
zu diesem Zeitpunkt undeclared ist. Sie scheinen den Punkt der Erklärung am Ende der enum-base zu platzieren, sie betrachten es als deklariert, sobald es abgeschlossen ist.
Beim Lesen der Spezifikationen;
§14.3.1/2 Template Typargumente
[Anmerkung: Eine Vorlagenart Argument kann einen unvollständigen Typ (3,9) sein. - Endnote]
Und
§7.2/6 Enumeration Erklärungen
Eine Aufzählung, deren zugrunde liegenden Typ befestigt ist, ist ein unvollständiger Typ von seinem Punkt der Deklaration (3.3.2) bis unmittelbar nach seiner enum-Basis (wenn überhaupt), an welchem Punkt es ein vollständiger Typ wird.
Zeigt an, dass es kompilierbar ist; wie dies bei CRTP-Implementierungen der Fall ist.
Ich bin mir sicher, wenn dies (d. H. Der Fehler zu kompilieren enum class E : CL<E>::UndType;
) ist die Absicht oder wenn es als ein Anwendungsfall angesehen wurde. Aus der Spezifikation wird der opaken Enum-Deklaration eine "spezielle" Behandlung gegeben. sein Basistyp und die Anforderung, dass es ein integraler Typ sein muss.
Vermutlich sollte der Code kompilierbar angesichts der Auflösung CWG#1482 sein.
Wie für aktuelle Problemumgehungen ...
Dies;
enum class E; // default underlying type is int
Die minimale Deklaration.
Die undurchsichtige Deklaration könnte entweder sein;
enum class E : int; // int base
Folgendes wäre eine vollständige Definition (einschließlich Enumeratoren);
enum class E : int {/*...*/};
Oder die Klassenvorlage zu verwenden, einen anderen Typ (möglicherweise void
) verwendet werden könnten.
enum class E : CL<void>::UndType;
Ich würde sagen, es ist bei der ';' (vor '// Fehler') der * Opak-Enum-Deklaration *. – Jarod42
Also in 'CL', 'E' ist in der Tat noch nicht deklariert :( –
Jarod42
Jarod42, aber warum ist es noch nicht erklärt? Standard sagt, dass es unmittelbar nach der Kennung ist, nicht wahr? Ich verstehe nicht es – user3514538