“ISO C ++ prohíbe las referencias directas a los tipos ‘enum'” al especificar el tipo subyacente de enumeración [duplicate]

2 minutos de lectura

avatar de usuario
vladimir panteleev

Dado el programa:

enum E : int
{
    A, B, C
};

g++ -c test.cpp funciona bien Sin embargo, clang++ -c test.cpp da los siguientes errores:

test.cpp:1:6: error: ISO C++ forbids forward references to 'enum' types
enum E : int
     ^
test.cpp:1:8: error: expected unqualified-id
enum E : int
       ^
2 errors generated.

Estos mensajes de error no tienen ningún sentido para mí. No veo ninguna referencia directa aquí.

  • FWIW, GCC ahora (a partir de 5 o 6) compila con ‑std=c++14 como predeterminado, mientras que Clang todavía usa ‑std=c++98 HASTA DONDE SE.

    – chris

    04/08/2016 a las 21:45


  • Creo que ayudaría si incluyeras versiones y opciones del compilador.

    – juanchopanza

    04/08/2016 a las 21:45

  • Esta me parece una pregunta razonable, no es un error tipográfico, y no es una pregunta que busque ayuda de depuración que no incluya el código y el mensaje de error.

    – usuario253751

    04/08/2016 a las 21:59

  • no votó, pero usando -std=c++11 es lo primero que debe intentar cuando usa una característica de C++ 11 y recibe mensajes de error extraños

    –MM

    04/08/2016 a las 23:36

  • No sabía en ese momento que era una función de C++ 11. La sintaxis no es nueva: los compiladores de MS han admitido esta sintaxis desde al menos VS2005.

    – Vladimir Panteleev

    04/08/2016 a las 23:37

avatar de usuario
vladimir panteleev

Especificar el tipo subyacente para una enumeración es una característica del lenguaje C++11. Para obtener el código para compilar, debe agregar el interruptor -std=c++11. Esto funciona tanto para GCC como para Clang.

Para las enumeraciones en C++03, el tipo integral subyacente está definido por la implementación, a menos que los valores del enumerador no puedan caber en un int o un int sin signo. (Sin embargo, el compilador de Microsoft ha permitido especificar el tipo subyacente de una enumeración como una extensión propietaria desde VS 2005).

  • Tienes razón: si compilas con la opción -std=c++11 funciona (demostración en línea). Con gcc anterior a 6 le damos una advertencia explícita. Con gcc 6 no hay necesidad de la bandera estándar.

    – Cristóbal

    04/08/2016 a las 22:05

  • @Christophe: Lo que quiere decir: con gcc 6, (finalmente) lo cambiaron para compilar C ++ 11 de forma predeterminada y requieren un cambio para cumplir con los estándares más antiguos.

    – Jerry Ataúd

    04/08/2016 a las 23:34

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad