¿Por qué recibo estas advertencias en Visual C ++ 2008 al crear una estructura?

Tengo este codigo

typedef struct { const char* fooString; const bool fooBool; }fooStruct; 

Y este inicializador:

 static const fooStruct foo[] = { {"file1", true}, {"file2", false}, .... }; 

Con este código tengo 3 advertencias en VS2008:

 error C2220: warning treated as error - no 'object' file generated warning C4510: '' : default constructor could not be generated warning C4512: '' : assignment operator could not be generated warning C4610: struct '' can never be instantiated - user defined constructor required 

La advertencia C4610 es incorrecta. Este es un error conocido en Visual C ++. Ver el error de Microsoft Connect “Emisión incorrecta de C4610”.

Adam Rosenfield explica por qué se emiten las otras dos advertencias (C4510 y C4512).

Es exactamente lo que dice el comstackdor: no puede generar un constructor predeterminado u operador de asignación para su estructura porque tiene un miembro const en él ( const bool fooBool ). Los miembros de la estructura que son const o que son referencias no pueden inicializarse por defecto, por lo que deben inicializarse explícitamente en un constructor u operador de asignación escrito por el usuario.

Una solución es escribir su propio constructor predeterminado y operador de asignación (y de acuerdo con la regla de tres , también debe escribir un constructor de copia; un destructor no es estrictamente necesario, pero es una buena práctica). La solución alternativa y más sencilla es hacer que fooBool no sea const . Entonces, el comstackdor generará felizmente el constructor predeterminado y el operador de asignación para usted.

Dado que ya está creando una serie de instancias const de estas con static const fooStruct foo[] = ... , la const adicional en fooBool tiene sentido.

Además, si realiza una inicialización parcial, MSVC2008 generará errores (al igual que MSVC2010), que es un comportamiento incorrecto según lo definido por C ++ 03 y C ++ 11. Publiqué más sobre esto en otro hilo en el desbordamiento de stack que puedes leer aquí

 // Partial initialization, leaving it to the compiler // to do aggregate value-initialization fooStruct foo ={"file1", /*missing true/false, compiler should set false*/ }; 

MSVC emitirá un error en este código junto con las advertencias que mencionó.