Driver::~Driver()
{
AutoCritSec acsDriverList(m_csDriverList,true);
DRIVERLIST::iterator it = m_DriverList.begin();
for(;it!=m_DriverList.end();it++)
{
if (it->second == this)
{
m_DriverList.erase(it);
it = m_DriverList.begin();
}
}
}
Khi tôi biên dịch chương trình trong studio trực quan 2003, chương trình của tôi hoạt động tốt và tốt. nhưng khi tôi làm như vậy vào năm 2010, sau đó khi thoát khỏi chương trình tôi nhận được một số lỗi nhưmap/set iterator không gia tăng/set iterator không gia tăng
Expression:map/set iterator not incrementable
và khi tôi bấm để bỏ qua điều này tôi nhận được
Expression:"standard c++ library out of range" && 0
Có ai có bất kỳ ý tưởng là những gì đang diễn ra ở đây: Tôi sẽ vô cùng mắc nợ vì bất cứ lời đề nghị nào của bất cứ ai. Tấn cảm ơn và mong muốn ấm áp.
Tốt giới thiệu của xóa/gỡ bỏ. Trong trường hợp cụ thể này m_DriverList dường như là một cặp chứa các cặp hoặc là một bản đồ của một số loại, kể từ khi thử nghiệm là trên nó-> thứ hai. Thay vì std :: remove nó sẽ yêu cầu std :: remove_if với hàm lambda hoặc so sánh. –
Nếu vùng chứa là bản đồ (tiêu đề câu hỏi, quyền truy cập vào thành viên 'giây') thì tôi không nghĩ rằng thành ngữ * xóa-xóa * có thể được áp dụng. Thành ngữ giống với vòng lặp while mà bạn có, nhưng thay vì khởi động lại lần lặp, bạn sao chép và chuyển tiếp trình lặp và sau đó xóa vị trí hiện tại. –
@ DavidRodríguez-dribeas @MarkTaylor: Tốt bắt; Tôi đã bị phân tâm bởi "Danh sách" trong tên biến. Trong C++ 11, 'erase' trả về bộ lặp (iterator) cho phần tử tiếp theo (hoặc đến một-past-the-end nếu không có phần tử tiếp theo), và Visual C++ 2010 hỗ trợ điều này. –