Problem mit <map>



  • Ich erstelle eine map folgendermaßen:

    map<string, vector<string> > mapDaten;
    mapDaten.insert("ein String", einVector /* vector<string> */);
    

    Der Compiler & Linker macht keine Probleme. Nur wenn das Programm an die Stelle von der insert-Methode kommt, kommt folgende Fehlermeldung, die ich leider nicht verstehe:

    error C2664: 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > c
    onst ,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >,struct std::map<class
    std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std:
    :char_traits<char>,class std::allocator<char> > > >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,struct std::char_trait
    s<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::al
    locator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<cha
    r> > > > > >::iterator __thiscall std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::a
    llocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::vector<cl
    ass std::basic_string<char,struct std::char_traits<char>
    ,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > >::insert(class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocat
    or<char> >,struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator
    <class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::vector<class std::basic_string<char,str
    uct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,clas
    s std::allocator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allo
    cator<char> > > > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::alloc
    ator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > >::iterator,const struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>
    > const ,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > &)' : Konvertierung
    des Parameters 1 von 'class std::basic_string<char,stru
    ct std::char_traits<char>,class std::allocator<char> >' in 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class st
    d::allocator<char> > const ,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >,
    struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_s
    tring<char,struct std::char_traits<char>,class std::allocator<char> > > >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,
    struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_trai
    ts<char>,class std::allocator<char> > >,class std::allocator<class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,cl
    ass std::allocator<char> > > > > >::iterator' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    Fehler beim Ausführen von cl.exe.
    Browse-Informationsdatei wird erstellt...

    Wäre schön, wenn mir jemand helfen könnte!



  • map<>::insert() erwartet keine zwei einzelnen Parameter, sondern ein komplett zusammengebautes pair<>:

    map<string, vector<string> > mapDaten;
    mapDaten.insert(make_pair("ein String", einVector));
    //oder
    mapDaten.insert(pair<const string, vector<string> >("ein String",einVector));
    //oder
    mapDaten.insert(map<string, vector<string> >::value_type("ein String,einVector));
    //oder
    mapDaten["ein String"]=einVector;
    


  • Hallo

    mapDaten.insert(std::make_pair("ein String", einVector));	
    // oder
    mapDaten["ein String"] = einVector;
    

    /Edit : Wieder mal zu spät...

    bis bald
    akari



  • Ihr Jungs seid der Hammer! 🙂 Vielen Dank, funktioniert!



  • Wieder mal die map!
    Bei diesem Quelltext:

    map<string, map<string, map<string, map<string, vector<string> > > > > mapDaten;
    map<string, map<string, map<string, vector<string> > > > mapLayer1;	
    mapDaten.insert(make_pair("test",mapLayer1));
    

    Kommt diese Fehlermeldung:

    error C2536: 'std::pair<char [5],class ?? :: ?? >::first' : Angabe einer expliziten Initialisierung für Arrays nicht moeglich

    Ich kann nur mit der Fehlermeldung, bezogen auf mein Problem, nichts anfangen. Auch die MSDN konnte mir nicht helfen.

    Hat jemand Rat?



  • Hallo

    #include <vector>
    #include <map>
    #include <string>
    
    using namespace std;
    
    int main()
    {
      map<string, map<string, map<string, map<string, vector<string> > > > > mapDaten;
      map<string, map<string, map<string, vector<string> > > > mapLayer1;
      mapDaten.insert(make_pair("test",mapLayer1));
    }
    

    Kompiliert bei mir ohne Probleme

    bis bald
    akari



  • Oh, jetzt ist der Text wieder weg! Warum? ^^

    Bei Dir ging alles fehlerfrei? Vielleicht versuche ich mal was anderes als make_pair.



  • Ich habe ja schon ein älteres System hier drauf. Kann es sein, dass es früher Beschränkungen der "Klassentiefe" gab? Vielleicht kommt er damit nicht klar?



  • plizer schrieb:

    Ich habe ja schon ein älteres System hier drauf. Kann es sein, dass es früher Beschränkungen der "Klassentiefe" gab? Vielleicht kommt er damit nicht klar?

    Was meinst du mit älterem System? Nutzt du zufällig Visual Studio 6? Das könnte einiges erklären! 😉



  • David_pb schrieb:

    plizer schrieb:

    Ich habe ja schon ein älteres System hier drauf. Kann es sein, dass es früher Beschränkungen der "Klassentiefe" gab? Vielleicht kommt er damit nicht klar?

    Was meinst du mit älterem System? Nutzt du zufällig Visual Studio 6? Das könnte einiges erklären! 😉

    ja, nutze ich :(.



  • plizer schrieb:

    ja, nutze ich :(.

    Updaten. VC++ 2005 EE (Express Edition) ist kostenlos und beinhaltet einen der momentan besten C++-Compiler. VC6 ist alt und buggy (was den C++-Standard angeht).

    Angesichts der Alternativen besteht kein Grund, veraltete Software einzusetzen.



  • Aber meine Firma entwickelt noch alles in VC6.0 und alle alten Programme sind darin geschrieben. 😞 Aber es ist echt nervig, weil ich schon öfter Fehlermeldungen hatte, die kein anderer bekommt. Und das Online-MSDN kann ich mir zum Teil auch knicken.



  • Dann wirds höchste Zeit für die Firma umzusteigen! 😉 Der Compiler von VS6 ist total unkonform zum C++ Standard.



  • Wenn hier das große Projekt abgeschlossen wird eh besprochen was man in Zukunft einsetzt. .Net, Java oder Visual C++ 2005. Ich hoffe ja es wird Java ;-). Die Performance ist dabei nicht mehr ganz so wichtig. Für hardwarenahe Programmierung, die hier immer seltener wird, kann man ja dann immer noch mit C programmieren.

    Kann ich jetzt mein <map> Problem da unten garnicht lösen?



  • pilzer hat erst die Firma gewechselt! Und er ist neu in C++, und hat vorher Java gemacht. Haben wir schon alles in einem langen MFC-Thread durch gekaut. Er muß mit VC6 auskommen!



  • plizer schrieb:

    Wieder mal die map!
    Bei diesem Quelltext:

    map<string, map<string, map<string, map<string, vector<string> > > > > mapDaten;
    map<string, map<string, map<string, vector<string> > > > mapLayer1;	
    mapDaten.insert(make_pair("test",mapLayer1));
    

    Kommt diese Fehlermeldung:

    error C2536: 'std::pair<char [5],class ?? :: ?? >::first' : Angabe einer expliziten Initialisierung für Arrays nicht moeglich

    Ich kann nur mit der Fehlermeldung, bezogen auf mein Problem, nichts anfangen. Auch die MSDN konnte mir nicht helfen.

    Hat jemand Rat?

    In welcher Zeile denn? Bei insert?

    Das Problem dürfte wahrscheinlich "test" sein. Probier mal folgendes:

    mapDaten.insert(make_pair(std::string("test"), mapLayer1));
    // ODER:
    std::string str("test");
    mapDaten.insert(make_pair(str, mapLayer1));
    


  • @Artchi: Das wars! Du bist ein Schatz 😉 Danke schön!
    (werd ich mir mal merken, das die strings mal öfter das Problem sein können)



  • Ja, der std::string ist in VC6 nicht ganz ISO-konform.


Anmelden zum Antworten