std::map::erase will nicht



  • Hi.
    Auf diesen Code:

    for (map<string, CUserData*>::iterator it = this->m_Users.begin(); it != this->m_Users.end(); )
    	{
    		// mach was
    		it = this->m_Users.erase(it);
    	}
    

    Folgt dieser Fehler:

    [code]/home/axiom/test/system.cpp: In member function ‘void CSystem::FreeConfigs()’:
    /home/axiom/test/system.cpp:89: error: no match for ‘operator=’ in ‘it = ((CSystem*)this)->CSystem::m_User.std::map<_Key, _Tp, _Compare, _Alloc>::erase [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = CUserData*, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, CUserData*> >](it)’
    /usr/include/c++/4.1.3/bits/stl_tree.h:152: note: candidates are: std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, CUserData*> >& std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, CUserData*> >::operator=(const std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, CUserData*> >&)
    

    [/code]

    Und das ganze nur unter Linux (gcc 4.1.3)
    Ich weiß einfach nicht wieso?!



  • Schau mal die Dokumentation an. Die von dir verwendete std::map::erase() -Überladung hat keinen Rückgabetyp. Da Iteratoren in assoziativen Containern gültig bleiben, kannst du Folgendes tun:

    m_Users.erase(it++);
    

    P.S.: Wenn du natürlich alle Elemente löschst, wäre es einfacher und schneller, am Schluss einmal clear() aufzurufen.



  • Oh, dann hat der MSVC da wohl ein extra eingebaut. Da geht das nämlich.
    Stimmt, aber bei std::vector gibt es ja einen Rückgabetyp. Habe nicht wirklich daran gedacht, dass sich eine std::map anders verhalten könnte. Bei std::vector würde der Iterator ja ungültig werden, wenn ich ihn lösche. In einer Map anscheinend nicht.

    Danke 🙂


Anmelden zum Antworten