2012-05-06 15 views
6

Il seguente codice compilato con gcc-4.5.1, ma non in Visual Studio 11.Visual Studio 11 errore di compilazione utilizzando std :: map

#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 è ora mappato std::array<> troll. L'inserimento funziona bene e il programma viene compilato. Ma, non appena provo auto z = x[1] -> quindi cercando di ottenere la matrice troll che 1 viene mappata, il programma non compila con il seguente errore:

error C2512: 'std::array<_Ty,_Size>::array': senza adeguata costruttore di default disponibili

Quali sono le cause questa differenza di comportamento tra gcc e vs11 e come risolverlo?

Grazie.

+0

Sei sicuro che 'pairus' non dovrebbe essere' make_pair'? (Non pensare che questo sia il tuo problema) – Corbin

+0

Sì, funziona bene con pairus di tipo std :: pair <>. Questo strano comportamento del compilatore mi sta facendo impazzire. – ScarletAmaranth

+0

Che aspetto ha pairus (assumendo che si tratti di una funzione personalizzata? O è l'alias di MSVC++ di make_pair?). Sospetto che il problema potrebbe risiedere in pairus perché non c'è bisogno di un costruttore predefinito in nessun punto del codice che hai postato. (Anche se sarebbe stato necessario un ctor predefinito se facessi x [k] dove k non è nella mappa.) – Corbin

risposta

4

Prova auto z = *x.find(1); invece. Il [] -operator richiede un tipo costruibile di default. In effetti, l'intero contenitore richiede un tipo costruibile di default, quindi non puoi aspettarti altro che sfortuna mentre provi varie implementazioni.

+0

Sei un genio! :) Lavori! :) Gcc sembra conoscere qualche magia arcana. Grazie;) – ScarletAmaranth

+0

Non sono sicuro che il fabbisogno predefinito del costruttore valga per l'intero contenitore ora che viene passato C++ 11. La nuova mappa deve essere in grado di contenere tipi mobili, ma solo alcune delle funzionalità sono disponibili per loro. L'operatore [] non è io non penso. –

3

Il tuo tipo non è assegnabile perché contiene costanti.

x [1] tenta di restituire un riferimento che è assegnabile. Costruirà anche un valore vuoto per la chiave se non è ancora lì. Entrambi non sono validi per il tuo tipo. Dovrai invece usare find.

+0

Perché mai gcc dovrebbe compilare la cosa :)? – ScarletAmaranth

+0

Lo standard indica solo ciò che è richiesto, non indica cosa è permesso. Alcuni modi in cui l'implementazione di gcc funziona non causano lo stesso problema nel tuo caso particolare. È libero di farlo. Non ci sono requisiti diagnostici qui. –

Problemi correlati