2013-10-09 6 views
7

Ich versuche, Karte der Karten mit C++ 11 zu initialisieren. Mein Compiler ist VS 2013 Express.Initialisierung der Karte von Karten mit Initialisiererliste in VS 2013

unordered_map<EnumType, unordered_map<string, string>> substitutions = { 
    { 
     Record::BasementType, 
     { 
      { "0", "" }, 
      { "1", "Slab or pier" }, 
      { "2", "Crawl" } 
     } 
    }, 
    { 
     Record::BuildingStyle, 
     { 
      { "0", "" }, 
      { "1", "Ranch" }, 
      { "2", "Raised ranch" } 
     } 
    }, 
    // ... and so on 
}; 

Es ist kompilieren, aber ich bekomme Haltepunkt in ntdll.dll. Jedoch vereinfachte Version dieses Codes:

unordered_map<EnumType, unordered_map<string, string>> substitutions = { 
    { 
     Record::BasementType, 
     { 
      { "0", "" }, 
      { "1", "Slab or pier" }, 
      { "2", "Crawl" } 
     } 
    }, 
    // *nothing more* 
}; 

funktioniert ordnungsgemäß.

Warum funktioniert das nicht, wenn ich mehr als ein Paar in der Karte habe? Wie geht es besser?

+0

"Ich bekomme Haltepunkt in ntdll.dll" ist zu vage. Gibt es eine Behauptung? Wenn ja, was sagt die Behauptung? – thelamb

+0

Aber es sieht so aus, ich bekomme Haltepunkt, der auf Ende der Initialisierungsliste zeigt, und dahinter gibt es nur Demontage. Im Debug-Modus ist es das gleiche, aber ich bekomme stacktrace durch std :: pair, std :: map, (disassembly), std :: _ Tree einige Male und es endet in der Datei xtree Zeile 327: _DEBUG_ERROR ("map/set iterators unvereinbar"); – omikron

+0

Ok, ich fürchte, ich kann im Moment nicht mehr helfen. Wenn ich später Zeit habe. Was Sie tun können, verwenden Sie einen Online-Compiler, um zu sehen, ob der Code dort läuft (z. B. mit G ++ oder Clang ++). Wenn ja, könnte es ein VS2013 Bug sein. Wenn ich mir den Code anschaue, sehe ich nicht, was falsch ist. – thelamb

Antwort

17

Dies ist ein bekannter Compilerfehler, http://connect.microsoft.com/VisualStudio/feedback/details/800104/. Der Compiler wird durch Provisorien in Initialisierungslisten verwirrt und kann sogar ein einzelnes Objekt wiederholt zerstören. Da dies lauter Codegen ist, habe ich das Compiler-Team gebeten, das Problem zu beheben.

+0

Ich dachte es ist eine Art Bug. Vielen Dank! – omikron

+0

Ich glaube, ich habe den gleichen Fehler (?) Mit einer Funktion namens 'struct X {void foo (/ *..........*/, std :: string const & data = {}); } '. Es stürzt zufällig ab, wenn es mit "Daten" standardmäßig aufgerufen wird, aber nicht immer. Habe ich Recht, das könnte der gleiche Fehler sein? _ [Gibt es auch eine Chance auf einen Hotfix?] _ – sehe

+1

Wie auch immer, ich denke, das könnte ein anderer Fehler sein. Hier ist die minimale Reproduzierer für den Fall, dass Sie interessiert sind: ** [Frage: (Bekannte) Compiler-Fehler in VC12?] (Http://StackOverflow.com/Questions/21044488/Knowledge-Compiler-Bug-in-VC12) ** – sehe

Verwandte Themen