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:
- 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.
- Seleccione la página Propiedades de configuración>C/C++>Avanzadas.
- 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;