Erreur d'exécution : carte/jeu de itérateurs incompatible
J'ai une erreur d'exécution "de la carte/jeu de itérateurs incompatible" à la ligne 8.
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 déclaré comme un multimap<int,Task*>
. Quel est le problème?
- Pourriez-vous reformater vous code de sorte qu'il est lisible et spécifier la langue que vous parlez dans les tags? Il pourrait vous aider à obtenir une réponse beaucoup plus rapide.
- c++ est le langage
Simulation
n'est pas une multimap - multimaps n'ont pas deGetTasks()
de la fonction membre.
Vous devez vous connecter pour publier un commentaire.
Je vais prendre un sauvage deviner et dire que le
Simulation::GetTasks()
signature ressemble à ceci:Cela crée un nouveau multimap (un copie) chaque fois que vous l'appelez.
Lorsque l'on compare les itérateurs, à la fois de la
multimap<int,Task*>
itérateurs doivent provenir de la même conteneur; puisque vous êtes l'obtention d'un nouvel exemplaire de chaque fois que vous appelezGetTasks()
, vous contrevenez à cette contrainte, et c'est la source de votre erreur. Vous avez également un autre problème - le temporaire multimap copies sont détruites après la déclaration de création en, de sorte que votre itérateurs sont invalidés instantanément.Vous avez deux choix, l'un est à la capture d'une copie en local et utiliser cette copie systématiquement:
Une autre est d'avoir
GetTasks()
renvoyer une référence à une persistante multimap, assurant la même qui est utilisée à chaque fois:Ou const référence:
Cela a l'avantage d'éviter l' (potentiellement importantes de charge) de la copie de la
multimap
.Notez que l'utilisation de const référence nécessite l'utilisation de
const_iterator
s à l'étape par le biais de la multimap. Je recommande de définir à la fois const et non const accesseurs (C++ choisir le bon en fonction de si laSimulation
pointeur ou de référence est const), sauf si vous voulez interdire la modification directe du sous-jacentmultimap
complètement, dans ce cas, vous pouvez définir uniquement lesconst
variante.