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
