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).



    1. der Compiler warnt dich, dass das Statement überflüssig ist. Wenn dich das stört, lass es weg
    2. 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.


Anmelden zum Antworten