std::map: Verstehe Fehlermeldung nicht:



  • Der []-Operator der map legt automatisch ein neues Element an, falls zu dem key noch keins vorhanden ist. Das bedeutet das dieser auch nicht konstant sein kann. Das wiederum bedeutet, dass du ihn nicht aus einer Konstanten Member-Funktion aufrufen kannst, weil der Aufruf würde ja unter Umständen die map verändern.

    Abhilfe ist so:

    map<string, string>::const_iterator it = m_settings.find(key);
    if(it!=m_settings.end()) {
      istringstream tmp(it.second);
      ..
    }
    


  • Original erstellt von Shade Of Mine:
    **mach aus const string setting_name mal ne referenz

    zeig mal wie du m_settings deklariert hast

    PS:
    warum wird der double als zeiger uebergeben?
    warum returnst du ihn nicht? oder warum keine referenz?**

    1. ok, mach ich 🙂
    2. damit man erkennt dass es sich um Call by Reference handelt... das sieht man imo besser bei

    bla->getSetting("foo", &dest);
    

    als bei

    bla->getSetting("foo", dest);
    

    3. die Funktion soll (spaeter mal) true zurueckgeben, wenn ein Wert gefunden werden kann, und false, wenn nicht... der eigentliche Wert wird im double uebergeben. Anderst geht das nicht, da 0 auch ein gueltiger Wert sein kann...

    @DrGreenthumb:
    thx 🙂



  • noch eine Frage:

    istringstream tmp(it.second);
    

    fuehrt zu:

    E:\works\code\cpp\bluePong\src\configfile.cpp(53) : error C2039: 'second' : Ist kein Element von 'const_iterator'
    

    soll das so sein?



  • Ups, sollte it->second heißen.



  • thx, jetzt gehts 🙂
    BTW: woher kommt das second? weder map noch const_iterator haben eine second-Element soweit ich das in meiner Referenz nachschlagen konnte? 😕

    Ach ja, letzte Frage, net so wichtig:
    zufaellig eine Ahnung woher folgende Fehlermeldungen kommen:

    D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\utility(17) : warning C4786: '?$pair@Viterator@?$_Tree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@2@U
    _Kfn@?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@D U?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@U?$less@V?$basic_s
    tring@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@_N' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::pair<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> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,st
    ruct std::char_traits<char>,class std::allocator<char> >,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::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::allocator<char> > >,class std::allocator
    <class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,bool>'
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Bei der Kompilierung der Member-Funktion 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &__thiscall std::map<class std::basic_string<char,s
    truct std::char_traits<char>,class std::allocator<char> >,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::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::operator [](const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)' der Klassenvorlage
    D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\utility(21) : warning C4786: '??0?$pair@Viterator@?$_Tree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@
    2@U_Kfn@?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_strin g@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@U?$less@V?$basi
    c_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@_N@std@@QAE@XZ' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::pair<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> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,st
    ruct std::char_traits<char>,class std::allocator<char> >,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::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::allocator<char> > >,class std::allocator
    <class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,bool>'
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Bei der Kompilierung der Member-Funktion 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &__thiscall std::map<class std::basic_string<char,s
    truct std::char_traits<char>,class std::allocator<char> >,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::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::operator [](const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)' der Klassenvorlage
    D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\utility(23) : warning C4786: '??0?$pair@Viterator@?$_Tree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@
    2@U_Kfn@?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_strin g@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@U?$less@V?$basi
    c_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@_N@std@@QAE@ABViterator@?$_Tree@V?$bas ic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$pair@$$CBV
    ?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@2@U_Kfn@?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_t raits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@D
    U?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$a llocator@D@2@@std@@@2@@1@AB_N@Z' : Bezeichner wurde auf '255' Zeichen
     in den Browser-Informationen reduziert
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::pair<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> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,st
    ruct std::char_traits<char>,class std::allocator<char> >,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::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::allocator<char> > >,class std::allocator
    <class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,bool>'
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Bei der Kompilierung der Member-Funktion 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &__thiscall std::map<class std::basic_string<char,s
    truct std::char_traits<char>,class std::allocator<char> >,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::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::operator [](const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)' der Klassenvorlage
    D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\utility(25) : warning C4786: '??0?$pair@Viterator@?$_Tree@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@
    2@U_Kfn@?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_strin g@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@U?$less@V?$basi
    c_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@_N@std@@QAE@ABU?$pair@$DCAB@$DCAC@@1@@ Z' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen 
    reduziert
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::pair<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> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,st
    ruct std::char_traits<char>,class std::allocator<char> >,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::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::allocator<char> > >,class std::allocator
    <class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,bool>'
            D:\Programme\Microsoft Visual Studio\VC98\INCLUDE\map(93) : Bei der Kompilierung der Member-Funktion 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &__thiscall std::map<class std::basic_string<char,s
    truct std::char_traits<char>,class std::allocator<char> >,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::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::operator [](const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)' der Klassenvorlage
    Linker-Vorgang läuft...
    


  • das sind warnungen



  • deswegen ist auch net so schlimm wenn niemand eine Ahnung hat woher die kommen 😉



  • die kommen vom debug modus 😉



  • Original erstellt von Blue-Tiger:
    deswegen ist auch net so schlimm wenn niemand eine Ahnung hat woher die kommen 😉

    #pragma warning(disable:4786)
    und ruhe ist

    das ist ne warnung dass die namen zu lange fuer den debugger sind und sie deswegen auf 255 zeichen gekuerzt werden.



  • Original erstellt von Blue-Tiger:
    BTW: woher kommt das second?

    Ein map-Element besteht aus zwei Werten, key und value.
    http://www.sgi.com/tech/stl/Map.html
    bzw. http://www.sgi.com/tech/stl/pair.html


Anmelden zum Antworten