Я собираюсь принять диких угадать и сказать, что Simulation::GetTasks()
подпись выглядит следующим образом:
multimap<int,Task*> GetTasks() const;
Это создает новый Multimap (а копия) каждый раз, когда вы называете его.
При сравнении итераторов оба итератора multimap<int,Task*>
должны поступать из одного и того же контейнера; поскольку вы получаете новую копию при каждом вызове GetTasks()
, вы нарушаете это ограничение, и это является источником вашей ошибки. У вас также есть другая проблема: временные копии мультимапов уничтожаются после утверждения, в котором они созданы, поэтому ваши итераторы недействительны мгновенно.
У вас есть два выбора; один должен захватить копию локально и использовать эту копию последовательно:
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();
}
Другой должен иметь GetTasks()
возвращать ссылку на персистирующей Multimap, обеспечивая тем же один используется каждый раз, когда:
multimap<int,Task*> &GetTasks();
Или константная ссылка:
const multimap<int,Task*> &GetTasks() const;
Это имеет то преимущество, что позволяет избежать (потенциально большой) накладных расходов копирование multimap
.
Обратите внимание, что для использования ссылки с константой необходимо использовать const_iterator
s для перехода через мультимап. Я бы рекомендовал определить как const, так и неконстантные аксессоры (C++ выберет правильный вариант, если указатель или ссылка- const), если вы не хотите полностью исключить прямое изменение базового multimap
, и в этом случае вы можете определить только вариант const
.
Не могли бы вы переформатировать код, чтобы он был читабельным и указывал язык, о котором вы говорите в тегах? Это поможет вам получить ответ намного быстрее. – rfunduk
C++ - это язык – user454563
'Simulation' не является мультимапом. Multimaps не имеют функции' GetTasks() 'member. – bdonlan