Je vais faire une supposition sauvage et dire que la signature Simulation::GetTasks()
ressemble à ceci:
multimap<int,Task*> GetTasks() const;
Cela crée une nouvelle multimap (une copie ) chaque fois que vous l'appelez. Lors de la comparaison des itérateurs, les deux itérateurs multimap<int,Task*>
doivent provenir du même conteneur; puisque vous obtenez une nouvelle copie chaque fois que vous appelez GetTasks()
, vous violez cette contrainte, et c'est la source de votre erreur. Vous avez également un autre problème: les copies multimap temporaires sont détruites après l'instruction dans laquelle elles ont été créées, de sorte que vos itérateurs sont instantanément invalidés.
Vous avez deux choix; on est de capturer une copie locale et d'utiliser cette copie cohérente:
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();
}
Une autre est d'avoir GetTasks()
renvoyer une référence à une persistante multimap, assurant le même est utilisé à chaque fois:
multimap<int,Task*> &GetTasks();
Ou une référence const:
const multimap<int,Task*> &GetTasks() const;
Cela a l'avantage d'éviter le (potentiellement important) de frais généraux copier le multimap
.
Notez que l'utilisation d'une référence const requiert l'utilisation de const_iterator
s pour parcourir le multimap. Je recommanderais de définir à la fois les accesseurs const et non-const (C++ choisira le bon si le pointeur ou la référence Simulation
est const), sauf si vous voulez désactiver complètement la modification directe du multimap
sous-jacent, auquel cas vous ne pouvez définir que la variante const
.
Pourriez-vous reformater votre code afin qu'il soit lisible et spécifier la langue dont vous parlez dans les balises? Cela vous aiderait à obtenir une réponse beaucoup plus rapidement. – rfunduk
C++ est le langage – user454563
'Simulation' n'est pas un multimap - les multimappes n'ont pas de fonction membre' GetTasks() '. – bdonlan