En-miembro de la clase de inicialización con una lista de inicializador de uso uniforme de sintaxis de inicialización?[duplicar]
Pregunta
Estoy tratando de compilar el siguiente con MSVC2013:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
}
El compilador me da el siguiente error: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
Si puedo cambiar el código a este:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{{false, false, false}};
}
el programa se compila y se ejecuta correctamente.Se trata de un problema con el compilador, o yo no entiendo la sintaxis?Por lo que he estado leyendo, la primera versión de compilación.
Solución
Aquí es el responsable de la gramática de N3797:
// after a member declaration:
braced-or-equal-initializer-list:
= initializer-clause
braced-init-list
braced-init-list:
{ initializer-list ,OPT }
{ }
initializer-list:
initializer-clause
initializer-list, initializer-clause
initializer-clause:
assignment-expression
braced-init-list
Así que yo diría que la primera afirmación es correcta, y de hecho es aceptado por
un reciente gcc
y clang
.
Otros consejos
Si para colocar los puntos y coma como se requiere
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
};
Entonces parece que es un error del compilador MS VC ++ 2013.Al menos el código se compila con éxito en www.ideone.com.
Structire Somestruct es un agregado y debe inicializarse usando una lista de inicializadores.