2012-05-06 13 views
6

Der folgende Code mit gcc-4.5.1 kompiliert, aber nicht in Visual Studio 11.Visual Studio 11 Fehler bei der Kompilierung mit 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 wird nun auf std::array<> troll abgebildet. Die Einfügung funktioniert gut und das Programm kompiliert. Aber sobald ich versuche auto z = x[1] -> Daher versucht das Array zu bekommen Troll, dass 1 zugeordnet wird, wird das Programm nicht mit dem folgenden Fehler kompilieren:

error C2512: 'std::array<_Ty,_Size>::array': kein geeigneter Standardkonstruktor verfügbar

Was sind die Ursachen dieser Unterschied im Verhalten zwischen gcc und vs11 und wie man es repariert?

Danke.

+0

Sind Sie sicher, dass 'pairus' nicht' make_pair' sein sollte? (Denken Sie nicht, dass das Ihr Problem ist) – Corbin

+0

Ja, es funktioniert gut, wenn Pairus vom Typ std :: pair <> ist. Dieses seltsame Verhalten des Compilers macht mich verrückt. – ScarletAmaranth

+0

Wie sieht das Paar aus (angenommen, es handelt sich um eine benutzerdefinierte Funktion oder ist es der MSVC++ Alias ​​von make_pair?). Ich vermute, dass das Problem in Pairus liegen kann, da kein Standardkonstruktor irgendwo in dem von Ihnen geposteten Code benötigt wird. (Obwohl ein Standard-Ctor benötigt würde, wenn du x [k] benutzt hättest, wobei k nicht in der Karte ist.) – Corbin

Antwort

4

Versuchen Sie stattdessen auto z = *x.find(1);. Der [] -Operator erfordert einen standardkonstruierbaren Typ. Tatsächlich benötigt der gesamte Container einen standardkonstruierbaren Typ, so dass Sie wirklich nichts als Zufall erwarten können, wenn Sie verschiedene Implementierungen ausprobieren.

+0

Du bist ein Genie! :) Funktioniert! :) Gcc scheint etwas arkane Magie zu kennen. Danke;) – ScarletAmaranth

+0

Nicht sicher, dass die Standardkonstruktoranforderung für den gesamten Container steht, jetzt, da C++ 11 übergeben wurde. Die neue Karte muss in der Lage sein, bewegliche Typen zu speichern, aber nur ein Teil der Funktionalität ist für sie verfügbar. Der [] Operator ist nicht ich denke nicht. –

3

Ihr Typ ist nicht zuweisbar, da er Konstanten enthält.

x [1] versucht, eine Referenz zu liefern, die zugewiesen werden kann. Es wird auch einen leeren Wert für den Schlüssel erstellen, wenn er noch nicht vorhanden ist. Beide sind mit Ihrem Typ ungültig. Sie müssen stattdessen suchen.

+0

Warum in aller Welt würde gcc das Ding dann kompilieren :)? – ScarletAmaranth

+0

Der Standard gibt nur an, was benötigt wird, es gibt nicht an, was erlaubt ist. Eine Art und Weise, in der die gcc-Implementierung funktioniert, verursacht in Ihrem speziellen Fall nicht das gleiche Problem. Es ist kostenlos, dies zu tun. Hier gibt es keine diagnostischen Anforderungen. –

Verwandte Themen