2012-05-06 12 views
6

El código siguiente se compila con gcc-4.5.1 pero no en Visual Studio 11.Studio 11 de error visual en tiempo de compilación usando std :: mapa

#include <map> 
#include <array> 

typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus; 

int main(){ 

    std::map<const unsigned int, std::array<const unsigned int, 4> > x; 
    std::array<const unsigned int, 4> troll = {1, 2, 3, 4}; 
    x.insert(pairus(1, troll)); 

    auto z = x[1]; 
} 

1 ahora se asigna a std::array<> troll. La inserción funciona bien y el programa se compila. Pero, tan pronto como lo intento auto z = x[1] -> Por lo tanto, tratando de obtener la matriz trol que 1 se correlaciona con, el programa no se compila con el siguiente error:

error C2512: 'std::array<_Ty,_Size>::array': ningún constructor predeterminado adecuado disponible

¿Qué causa esta diferencia en el comportamiento entre gcc y vs11 y cómo solucionarlo?

Gracias.

+0

¿Estás seguro de que 'pairus' no debería ser' make_pair'? (No creo que ese sea su problema) – Corbin

+0

Sí, funciona bien con el par siendo de tipo std :: pair <>. Este extraño comportamiento del compilador me está volviendo loco. – ScarletAmaranth

+0

¿Cómo se ve el par (suponiendo que sea una función personalizada o es el alias de make_pair de MSVC++?). Sospecho que el problema puede estar en el par porque no hay necesidad de un constructor predeterminado en ninguna parte del código que publicaste. (Aunque se necesitaría un ctor predeterminado si hiciera x [k] donde k no está en el mapa.) – Corbin

Respuesta

4

Pruebe auto z = *x.find(1); en su lugar. El operador [] requiere un tipo construible por defecto. De hecho, todo el contenedor requiere un tipo construible por defecto, por lo que no puede esperar nada más que suerte al azar mientras prueba varias implementaciones.

+0

¡Eres un genio! :) ¡Trabajos! :) Gcc parece saber algo de magia arcana. Gracias;) – ScarletAmaranth

+0

No estoy seguro de que el requisito de constructor predeterminado signifique todo el contenedor ahora que se pasa C++ 11. El nuevo mapa debe poder contener tipos móviles, pero solo parte de la funcionalidad está disponible para ellos. El operador [] no es, no creo. –

3

Su tipo no es asignable porque contiene constantes.

x [1] intenta devolver una referencia que se puede asignar. También construirá un valor vacío para la clave si aún no está allí. Ambos son inválidos con tu tipo. Tendrás que usar find en su lugar.

+0

¿Por qué demonios compilaría la cosa entonces :)? – ScarletAmaranth

+0

La norma solo establece lo que se requiere, no establece lo que está permitido. De alguna manera, la implementación de gcc no causa el mismo problema en su caso especial. Es gratis hacer esto. No hay requisitos de diagnóstico aquí. –

Cuestiones relacionadas