2010-09-22 30 views
6

j'ai une erreur d'exécution "carte/set itérateurs incompatible" à la ligne 8.: Erreur d'exécution carte/set itérateurs 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 déclarée comme multimap<int,Task*>. Quel est le problème?

+0

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

+0

C++ est le langage – user454563

+1

'Simulation' n'est pas un multimap - les multimappes n'ont pas de fonction membre' GetTasks() '. – bdonlan

Répondre

16

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.

+0

trouvé ceci utile !! – hello

+0

Ceci est la solution mon problème. Renvoyé un std :: multimap par un membre comme non référence – dgrat