sirve resueltos que programas problemas practicar para estructuras estructura enum ejercicios datos con c++ c++11 enums declaration c++14

c++ - resueltos - Punto de declaración para una enumeración.



problemas con estructuras c++ (1)

El seguimiento;

enum class E : CL<E>::UndType;

No se acepta como una declaración válida en algunas implementaciones actuales (clang ++, g ++ y MSVC probados). No aceptan el tipo E , aún incompleto, en el CL<E>::UndType en la base de enumeración CL<E>::UndType . El error que se da en las implementaciones probadas es que E no está declarada en ese momento. Parece que colocan el punto de declaración al final de la base de enumeración , lo consideran declarado una vez que está completo.

Al leer las especificaciones;

§14.3.1 / 2 Argumentos de tipo de plantilla

[Nota: un argumento de tipo de plantilla puede ser un tipo incompleto (3.9). - nota final]

Y

§7.2 / 6 Declaraciones de enumeración

Una enumeración cuyo tipo subyacente es fijo es un tipo incompleto desde su punto de declaración (3.3.2) hasta inmediatamente después de su enum-base (si corresponde), en cuyo punto se convierte en un tipo completo.

Lo insinúa que es compilable; Como es el caso de las implementaciones de CRTP.

Estoy seguro de que si esto (es decir, la falta de compilación de enum class E : CL<E>::UndType; ) es la intención o si se consideró como un caso de uso. A partir de la especificación, a la declaración de enumeración opaca se le da un tratamiento "especial" con su tipo de base y el requisito de que sea un tipo integral.

Presumiblemente, el código debe ser compilable dada la resolución a open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1482 .

En cuanto a las soluciones actuales ...

Esta;

enum class E; // default underlying type is int

Es la declaración mínima.

La declaración opaca podría ser cualquiera;

enum class E : int; // int base

La siguiente sería una definición completa (incluidos los enumeradores);

enum class E : int {/*...*/};

O para usar la plantilla de clase, se podría usar otro tipo (posiblemente void ).

enum class E : CL<void>::UndType;

¿Cuál es el punto de declaración de tipos de enumeración? ¿Es inmediatamente después del nombre de una enumeración? Vi el estándar C ++ 14 (n4296) §3.3.2 / 3:

El punto de declaración para una enumeración es inmediatamente después del identificador (si existe) en su especificador de enumeración (7.2) o su primera declaración de enumeración opaca (7.2), lo que ocurra primero

Pero cuando intento reproducirlo;

template <class T> struct CL { using UndType = int; }; enum class E: CL<E>::UndType; //error: E is undefined

He recibido un error en todos los compiladores, aunque la enum-base para la enumeración E se coloca después del identificador y debe estar visible.