2010-09-22 18 views
6

I tienen un error de ejecución "mapa/set iteradores incompatible" en la línea 8.Runtime Error: mapa/set iteradores incompatibles

void Manager::Simulate(Military* military, Shalishut* shalishut,char* args[]){ 
    Simulation* simulation = Simulation::GetInstance(); 
    Time* time = Time::GetInstance(); 

    multimap<int,Task*>::iterator itTasks; 
    itTasks = simulation->GetTasks().begin(); 
    while(itTasks != simulation->GetTasks().end()){ 
     while (itTasks->second->GetTimeStamp() == time->GetTime()){ /*line 8 - ERROR*/ 
      TaskExecute(itTasks->second,military,shalishut,args); 
      itTasks++; 
     } 
     // Unit take car of vehicles 
     time->TimeIncrease(); 
    } 

} 

Simulation está declarada como una multimap<int,Task*>. ¿Cuál es el problema?

+0

¿Podría formatear su código para que sea legible y especifique el idioma del que está hablando en las etiquetas? Te ayudaría a obtener una respuesta mucho más rápido. – rfunduk

+0

C++ es el lenguaje – user454563

+1

'Simulación' no es un multimapa: los multimaps no tienen una función de miembro' GetTasks() '. – bdonlan

Respuesta

16

voy a tomar una conjetura salvaje y decir que la firma Simulation::GetTasks() se ve así:

multimap<int,Task*> GetTasks() const; 

Esto crea una nueva multimap (una copia ) cada vez que la llame.

Al comparar iteradores, ambos iteradores multimap<int,Task*> deben provenir del mismo contenedor; ya que obtiene una nueva copia cada vez que llama al GetTasks(), infringe esta restricción y esta es la fuente de su error. También tiene otro problema: las copias temporales multimapa se destruyen después de la declaración en la que se crearon, por lo que los iteradores se invalidan al instante.

Tiene dos opciones; uno es para capturar una copia local y usar dicha copia constantemente:

multimap<int,Task*> tasks = simulation->GetTasks(); 
multimap<int,Task*>::iterator itTasks; 
itTasks = tasks.begin(); 
while(itTasks != tasks.end()){ 
    while (itTasks->second->GetTimeStamp() == time->GetTime()){ 
     TaskExecute(itTasks->second,military,shalishut,args); 
     itTasks++; 
    } 
    // Unit take car of vehicles 
    time->TimeIncrease(); 
} 

Otra es tener GetTasks() devolver una referencia a una persistente multimap , asegurando la misma se utiliza cada vez:

multimap<int,Task*> &GetTasks(); 

o una referencia const:

const multimap<int,Task*> &GetTasks() const; 

Esto tiene la ventaja de evitar la (potencialmente grande) de arriba de copiando el multimap.

Tenga en cuenta que el uso de una referencia constante requiere el uso de const_iterator s para recorrer el multimapa. Recomendaría definir accesos const y non const (C++ seleccionará el correcto según si el puntero o referencia Simulation es const), a menos que desee deshabilitar completamente la modificación directa del multimap subyacente, en cuyo caso solo puede definir la variante const.

+0

¡Encontré esto útil! – hello

+0

Esta es la solución de mi problema. Devuelto un std :: multimap por un miembro como no referencia – dgrat

Cuestiones relacionadas