Bắt đầu từ Visual Studio 2010, lặp qua một bộ dường như trả về một trình lặp mà dereferences dữ liệu là 'const data' thay vì không const.Tham chiếu Const khi thiết lập lặp lại dereferencing trên thiết lập, bắt đầu từ Visual Studio 2010
Đoạn mã sau là ví dụ về thứ gì đó biên dịch trên Visual Studio 2005, nhưng không phải vào năm 2010 (đây là một ví dụ nhân tạo, nhưng minh họa rõ ràng vấn đề chúng tôi tìm thấy trên mã riêng của chúng tôi).
Trong ví dụ này, tôi có một lớp lưu trữ vị trí cùng với nhiệt độ. Tôi xác định toán tử so sánh (không phải tất cả chúng, chỉ đủ để minh họa vấn đề) mà chỉ sử dụng vị trí chứ không phải nhiệt độ. Vấn đề là đối với tôi hai trường hợp giống hệt nhau nếu vị trí giống hệt nhau; Tôi không quan tâm đến nhiệt độ.
#include <set>
class DataPoint
{
public:
DataPoint (int x, int y) : m_x(x), m_y(y), m_temperature(0) {}
void setTemperature(double t) {m_temperature = t;}
bool operator<(const DataPoint& rhs) const
{
if (m_x==rhs.m_x) return m_y<rhs.m_y;
else return m_x<rhs.m_x;
}
bool operator==(const DataPoint& rhs) const
{
if (m_x!=rhs.m_x) return false;
if (m_y!=rhs.m_y) return false;
return true;
}
private:
int m_x;
int m_y;
double m_temperature;
};
typedef std::set<DataPoint> DataPointCollection;
void main(void)
{
DataPointCollection points;
points.insert (DataPoint(1,1));
points.insert (DataPoint(1,1));
points.insert (DataPoint(1,2));
points.insert (DataPoint(1,3));
points.insert (DataPoint(1,1));
for (DataPointCollection::iterator it=points.begin();it!=points.end();++it)
{
DataPoint &point = *it;
point.setTemperature(10);
}
}
Trong thói quen chính tôi có một bộ mà tôi thêm một số điểm. Để kiểm tra tính chính xác của toán tử so sánh, tôi thêm các điểm dữ liệu với cùng một vị trí nhiều lần. Khi viết nội dung của bộ, tôi có thể thấy rõ chỉ có 3 điểm trong bộ này.
Vòng lặp cho vòng lặp trên bộ và đặt nhiệt độ. Về mặt logic, điều này được cho phép, vì nhiệt độ không được sử dụng trong các toán tử so sánh.
Mã này biên dịch một cách chính xác trong Visual Studio 2005, nhưng cho lỗi biên dịch trong Visual Studio 2010 trên dòng sau (trong vòng lặp cho-):
DataPoint &point = *it;
Các lỗi cho là nó không thể gán "const DataPoint" thành [không const] "DataPoint &".
Dường như bạn không có cách viết phong nha (= không bẩn) viết mã này trong VS2010 nếu bạn có toán tử so sánh chỉ so sánh các phần của thành viên dữ liệu.
giải pháp có thể là:
- Thêm một const-cast vào dòng nơi nó mang lại cho một lỗi
- Làm nhiệt độ có thể thay đổi và làm cho setTemperature một phương pháp const
Nhưng đối với tôi cả hai giải pháp có vẻ khá 'bẩn thỉu'.
Có vẻ như ủy ban tiêu chuẩn C++ đã bỏ qua tình huống này. Hay không?
Giải pháp sạch để giải quyết vấn đề này là gì? Một số người trong số các bạn gặp vấn đề tương tự này và bạn đã giải quyết nó như thế nào?
Patrick
http://connect.microsoft.com/VisualStudio/feedback/details/532300/std-set-t-iterator-and-std-set-t-const-iterator-are-the- cùng loại-break-code – mlvljr
Liên kết đẹp. Có vẻ tôi không phải là người duy nhất tìm thấy nó. – Patrick
Yup, tôi vừa viết một số (bây giờ rõ ràng) lỗi stl :: bộ mã và sau một giờ gỡ lỗi này-và-đó đi googling, đến cả hai ở đây và có :) – mlvljr