2010-09-22 33 views
6

Tôi có một lỗi runtime "bản đồ/thiết lặp không tương thích" tại dòng 8.RunTime Lỗi: Bản đồ/bộ lặp không tương thích

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 được khai báo là một multimap<int,Task*>. Vấn đề là gì?

+0

Bạn có thể định dạng lại mã để có thể đọc được và chỉ định ngôn ngữ bạn đang nói trong các thẻ không? Nó sẽ giúp bạn nhận được câu trả lời nhanh hơn nhiều. – rfunduk

+0

C++ là ngôn ngữ – user454563

+1

'Mô phỏng' không phải là một multimap - multimaps không có hàm' Thành viên GetTasks() '. – bdonlan

Trả lời

16

tôi sẽ có nhiều phán đoán và nói rằng chữ ký Simulation::GetTasks() trông như thế này:

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

này tạo ra một Multimap mới (một sao chép) mỗi lần bạn gọi nó.

Khi so sánh trình lặp, cả hai trình biến lặp multimap<int,Task*> phải đến từ cùng một vùng chứa; vì bạn đang nhận được một bản sao mới mỗi lần bạn gọi GetTasks(), bạn vi phạm ràng buộc này và đây là nguồn gốc của lỗi của bạn. Bạn cũng có một vấn đề khác - các bản sao đa tạm thời bị hủy sau khi câu lệnh được tạo ra, vì vậy các trình vòng lặp của bạn bị vô hiệu hóa ngay lập tức.

Bạn có hai lựa chọn; một là để nắm bắt một bản sao cục bộ và sử dụng rằng sao chép một cách nhất quán:

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(); 
} 

khác là có GetTasks() trả về một tham chiếu đến một dai dẳng Multimap, đảm bảo một tương tự được sử dụng mỗi lần:

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

Hoặc tham chiếu const:

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

Điều này có lợi thế là tránh chi phí (tiềm năng lớn) của sao chép multimap.

Lưu ý rằng việc sử dụng tham chiếu const yêu cầu sử dụng const_iterator s để thực hiện bước qua multimap. Tôi sẽ khuyên bạn nên xác định cả hai truy cập const và non-const (C++ sẽ chọn một quyền dựa trên nếu con trỏ hoặc tham chiếu Simulation là const), trừ khi bạn muốn không cho phép sửa đổi trực tiếp toàn bộ multimap bên dưới, trong trường hợp này bạn chỉ có thể xác định biến thể const.

+0

Tìm thấy thông tin hữu ích này !! – hello

+0

Đây là giải pháp cho vấn đề của tôi. Trả về một tiêu chuẩn :: multimap bởi một thành viên như là một tham chiếu không – dgrat

Các vấn đề liên quan