c++ - enclosed - ¿Es posible pasar datos como initializer_list a std:: array of structures?
c++ initializer list (1)
std::array
es un agregado que contiene una matriz, por lo que necesita un par adicional de llaves para inicializarlo a partir de una matriz regular:
{1,2} // TheClass
{{1,2},{2,3}} // TheClass[2]
{{{1,2},{2,3}}} // std::array<TheClass,2>
{{{{1,2},{2,3}}}} // OtherClass<2>
Sin embargo, parece que las versiones anteriores de GCC todavía se esfuerzan por esto: 4.5.1 lo rechaza , mientras que 4.6.1 lo acepta.
tengo el siguiente código. Básicamente, quiero inicializar una std :: array de estructuras que no sean POD utilizando la sintaxis de inicialización agregada. Tanto g ++ 4.6 como 4.7 (última instantánea semanal) no compilan el código.
#include <array>
struct TheClass {
int a1, a2;
TheClass(int b1, int b2) : a1{b1}, a2{b2} {};
};
template<unsigned D>
struct OtherClass {
std::array<TheClass, D> a;
OtherClass(std::array<TheClass, 2> b) : a{b} {};
};
int main()
{
OtherClass<2>{{ {1, 2}, {2, 3} }}; //tried a lot of options here
}
Errores de GCC:
v.cpp: In function ‘int main()’:
v.cpp:20:37: error: no matching function for call to ‘OtherClass<2u>::OtherClass(<brace-enclosed initializer list>)’
v.cpp:20:37: note: candidates are:
v.cpp:15:5: note: OtherClass<D>::OtherClass(std::array<TheClass, 2ul>) [with unsigned int D = 2u]
v.cpp:15:5: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::array<TheClass, 2ul>’
v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(const OtherClass<2u>&)
v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const OtherClass<2u>&’
v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(OtherClass<2u>&&)
v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘OtherClass<2u>&&’
Mis preguntas: ¿el código anterior es correcto? Parece que como std :: array es un agregado, no debería haber problemas para construir sus miembros de datos. Tal vez es un error en GCC?
EDITAR :
OtherClass<2>{{ TheClass{1, 2}, TheClass{2, 3} }};
funciona, por supuesto, pero no quiero usar eso ya que tengo que construir la clase en muchos lugares. C ++ 11 debe apoyar la omisión de TheClass
. También vea esta pregunta .