Compartir a través de


Advertencia del compilador (nivel 1) C5208 y error C7626

la clase sin nombre que se usa en el nombre typedef no puede declarar miembros que no sean miembros de datos no estáticos, enumeraciones de miembros o clases de miembros

Comentarios

Las clases sin nombre dentro de una declaración typedef no pueden tener miembros que no sean:

  • Miembros de datos no estáticos sin inicializadores de miembro predeterminados
  • Clases de miembro
  • Enumeraciones de miembros

Las mismas restricciones se aplican de forma recursiva a cada clase anidada. La restricción está pensada para garantizar la simplicidad de las estructuras que tienen nombres typedef para la vinculación. Deben ser lo suficientemente simples como para que no sea necesario realizar cálculos de vinculación antes de que el compilador obtenga el nombre de typedef para la vinculación.

Esta advertencia es nueva en Visual Studio 2019, versión 16.6. En función de P1766R1 adoptado por el comité de estándares de C++ como informe de defectos, afecta a todos los modos estándar del compilador. En los modos predeterminados /std:c++14 y /std:c++17, el compilador emite la advertencia C5208 para el código que no es conforme. Si se especifica /permissive-, el compilador emite la advertencia C5208 como un error en /std:c++14. El compilador emite el error C7626 para el código no conforme cuando se especifica /std:c++17 o posterior.

Para desactivar la advertencia sin realizar cambios en el código

Para desactivar la advertencia en una línea de código concreta, utilice la pragma warning, #pragma warning(suppress : 5208). También se puede en un archivo mediante utilice la pragma warning, #pragma warning(disable : 5208). La advertencia se puede desactivar globalmente en compilaciones de línea de comandos mediante la opción de línea de comandos /wd5208.

Si desea desactivar la advertencia para un proyecto entero en el IDE de Visual Studio:

  1. Abra el diálogo Páginas de propiedades del proyecto. Para obtener información sobre cómo usar el cuadro de diálogo Páginas de propiedades, consulte Páginas de propiedades.
  2. Seleccione la página Propiedades de configuración>C/C++>Avanzadas.
  3. Edite la propiedad Deshabilitar advertencias específicas para agregar 5208. Seleccione Aceptar para aplicar los cambios.

Ejemplo

En el ejemplo siguiente se muestran las construcciones que ya no se permiten en las estructuras sin nombre. Según el modo estándar especificado, se emiten errores o advertencias de C5208 o C7626:

struct Base { };
typedef struct : Base // inheriting from 'Base'; ill-formed
{
    void fn(); // ill-formed
    static int i; // ill-formed
    struct U {
        void f(); // nested class has non-data member; ill-formed
    };
    int j = 10; // default member initializer; ill-formed
} S;

El código anterior se puede corregir asignando un nombre a la clase sin nombre:

struct Base { };
typedef struct NamedType : Base
{
    void fn();
    static int i;
    struct U {
        void f();
    };
    int j = 10;
} S;