Statement has no effect
-
void TimerController::update( const u32 delta, const u32 ticks ) { m_counter += delta; NLTimerList::iterator it = m_timers.begin(); for ( it; it != m_timers.end(); ++it ) // WARNUNG { Timer* t = it->second; u32 delay = m_counter - t->getStartingTime(); if ( delay >= t->getInterval() ) { t->setStartingTime(m_counter); if ( t->isRunning() ) { t->fire(delay); if ( t->isOneShot() ) { delete t; it = m_timers.erase(it); // FEHLER if ( it == m_timers.end() ) { break; } } } } } // Fire global update event m_logic_event(delta, ticks); }Das meldet mir MinGW als Warnung beim Beginn der for-schleife.
Ausserdem gibts auch eine Fehlermeldung:no match for 'operator=' in 'it = ((NightLight::TimerController*)this)->NightLight::TimerController::m_timers.std::map<_Key, _Tp, _Compare, _Alloc>::erase<std::basic_string<char>, NightLight::Timer*, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, NightLight::Timer*> > >(it)'
Die Warnung bekomme ich nen paar mal, jeddesmal bei andere for-schleifen die gleich gestrickt sind, aber ich kann hier nicht sehen wo der Fehler liegen soll.
Unter VC++ 2008 kompiliert das Warnungs- und Fehlerfrei.Definition:
typedef std::map<std::string, Timer*> TimerList; TimerList m_timers;Kann jemand weiterhelfen?
-
Was soll denn das erste it auch bewirken?
-
Es bewirkt nichts, nur ob ich da jetzt nen Semikolon setze oder das it; hinschreibe, sollte keinen Unterschied machen.
Die Fehlermeldung gibt mir aber wirklich Rätsel auf.
Ich kann da keinen Fehler erkennen.
Ich hab den neuesten MINGW(4.70).
-
- der Compiler warnt dich, dass das Statement überflüssig ist. Wenn dich das stört, lass es weg
- was liefert erase einer Map zurück?
-
Danke. VC++ liefert hier einen iterator auf das nächste Element zurück.
Aber in der offiziellen stl scheint das nicht so zu sein.http://msdn.microsoft.com/en-us/library/z2f3cb7h(v=vs.71).aspx
http://www.cplusplus.com/reference/stl/map/erase/
-
Das hat mglw. nichts mit dem VC++, sondern mit dem neuen Standard zu tun. In C++98 gibt die erase-Methode eines assoziativen Containers void zurück, in C++11 einen Iterator.
-
VC2008 hat afaik kein C++11 Support, zumindest hab ich nichts aktiviert und auch nicht installiert in die Richtung.
Ist einfach das Microsoft erase() :D.
Habs jetzt anders gelöst, indem ich den iterator kopiere, inkrementiere und dann lösche per erase.