2010-09-22 11 views
6

iterators मैं एक रनटाइम त्रुटि लाइन 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 पर "नक्शा/iterators असंगत सेट" एक multimap<int,Task*> के रूप में घोषित किया गया है। समस्या क्या है?

+0

क्या आप कोड को दोबारा सुधार सकते हैं ताकि यह पठनीय हो और टैग में आप जिस भाषा के बारे में बात कर रहे हों उसे निर्दिष्ट कर सकें? यह आपको बहुत जल्दी उत्तर देने में मदद करेगा। – rfunduk

+0

सी ++ भाषा – user454563

+1

'सिमुलेशन' एक मल्टीमैप नहीं है - मल्टीमैप में 'GetTasks() 'सदस्य फ़ंक्शन नहीं है। – bdonlan

उत्तर

16

मैं एक जंगली अनुमान लेने के लिए जा रहा हूँ और कहते हैं कि Simulation::GetTasks() हस्ताक्षर इस तरह दिखता है:

multimap<int,Task*> GetTasks() const; 

यह एक नया मल्टीमैप (एक कॉपी) हर बार जब आप इसे कहते पैदा करता है।

इटरेटर की तुलना करते समय, multimap<int,Task*> दोनों हीटर एक ही कंटेनर से आते हैं; चूंकि आप GetTasks() पर कॉल करते समय हर बार एक नई प्रति प्राप्त कर रहे हैं, तो आप इस बाधा का उल्लंघन करते हैं, और यह आपकी त्रुटि का स्रोत है। आपको एक और समस्या भी है - अस्थायी मल्टीमैप प्रतियां उनके द्वारा बनाए गए बयान के बाद नष्ट हो जाती हैं, इसलिए आपके इटरेटर तुरंत अमान्य हो जाते हैं।

आपके पास दो विकल्प हैं;

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() के लिए एक लगातार मल्टीमैप के लिए एक संदर्भ लौटने के लिए, यह सुनिश्चित करना ही एक हर बार इस्तेमाल किया जाता है: एक एक प्रति स्थानीय और उपयोग है कि लगातार नकल पर कब्जा करने की है

या एक स्थिरांक संदर्भ:

const multimap<int,Task*> &GetTasks() const; 

यह (संभावित बड़े) की भूमि के ऊपर से बचने का लाभ दिया है multimap की प्रतिलिपि बनाएँ।

ध्यान दें कि एक कॉन्स्ट संदर्भ का उपयोग करने के लिए const_iterator एस का उपयोग मल्टीमैप के माध्यम से करने के लिए आवश्यक है। मैं दोनों कॉन्स और गैर-कॉन्स एक्सेसर्स को परिभाषित करने की अनुशंसा करता हूं (सी ++ Simulation पॉइंटर या संदर्भ कॉन्स के आधार पर सही विकल्प चुनता है), जब तक कि आप अंतर्निहित multimap पूरी तरह से प्रत्यक्ष संशोधन को अस्वीकार नहीं करना चाहते हैं, इस स्थिति में आप केवल परिभाषित कर सकते हैं const संस्करण।

+0

यह सहायक पाया !! – hello

+0

यह मेरी समस्या का समाधान है। किसी सदस्य द्वारा गैर संदर्भ के रूप में एक std :: multimap लौटाया – dgrat