2012-03-11 7 views

Respuesta

8

Di:

const A a[3] = { {0,0}, {1,1}, {2,2} }; 

En los compiladores de más edad, y asumiendo A tiene un constructor de copia accesible, que tiene que decir:

const A a[3] = { A(0,0), A(1,1), A(2,2) }; 

C++ solía ser bastante deficiente con respecto a las matrices (determinado las inicializaciones simplemente no eran posibles en absoluto), y esto mejoró un poco en C++ 11.

+0

En el primer caso, el compilador simplemente emita un calentamiento: 'main.cpp: 10: 32 : advertencia: listas de inicializador ampliadas solo disponibles con -std = C++ 0x o -std = gnu ++ 0x [habilitado de manera predeterminada]. ' ¿Qué significa "accesible"? ¿uno público ?, y, gracias. –

+0

@UniMouS: en GCC, compile con '-std = C++ 0x'. Accesible significa que puede acceder a él, es decir, no es privado o '= borrar'd. –

+0

gracias, @Kerrek: ¿y cuál es el significado de '= borrar'? –

1

Mientras el tipo tiene un constructior copia (ya sea sintetizado o explícitamente definido) las siguientes obras:

A array[] = { A(1, 3), A(3, 4), A(5, 6) }; 

Este trabajo tanto con C++ 2003 y C++ 2011. La solución publicado por KerrekSB ciertamente hace no funciona con C++ 2003 pero puede funcionar con C++ 2011 (no estoy seguro si funciona allí).

+0

El constructor de copia también debe ser accesible. Solo * tener * uno no es suficiente. –

0

puede proporcionar un constructor predeterminado e inicializar su matriz de forma normal. Después de la inicialización exitosa, utilizar un bucle para volver a asignar valores a cada miembro de

0

creo que debe ser así

const A a[3] = { A(1, 2), A(3, 4), A(5, 6) };

+0

el nuevo le hará punteros a A, no instancias A –

+0

el compilador emitirá un error: main.cpp: 9: 42: error: conversión de 'A *' a no escalar tipo 'A' solicitado –

+0

lo siento , la respuesta ha corregido – hamed

Cuestiones relacionadas