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
.
¿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
C++ es el lenguaje – user454563
'Simulación' no es un multimapa: los multimaps no tienen una función de miembro' GetTasks() '. – bdonlan