Tôi có một lớp học mà trông giống như sau:Rắc rối với const/không const độ phân giải quá tải
class ClassA
{
public:
float Get(int num) const;
protected:
float& Get(int num);
}
Bên ngoài của lớp, tôi gọi là Nhận) chức năng (.
float foo = classAInstance.Get(i);
Tôi hy vọng điều này để gọi phiên bản nào, nhưng thay vào đó Visual Studio lỗi out:
error C2248: 'ClassA::Get' : cannot access protected member declared in class 'ClassA'
Khi ý kiến ra tình trạng quá tải bảo vệ và loại bỏ tất cả các tham chiếu đến nó, mã biên dịch.
Tại sao trình biên dịch cố gắng sử dụng thành viên không thể truy cập khi có thể truy cập được? Có cách nào được chấp nhận để buộc trình biên dịch chọn quá tải chính xác không? Có một tham chiếu đến các quy tắc giải quyết cho các chức năng thành viên ở đâu đó không?
Ví dụ này có vẻ nguy hiểm. Với 'string func();' và một biểu thức của 'Blah b (func())' sẽ biên dịch và vẫn dẫn đến một tham chiếu lơ lửng. Quy tắc của tôi ở đây là: * Không bao giờ * giữ lại các tham số 'const &'.bạn nói gì? –
@MartinBa: Chắc chắn bạn cũng muốn 'Blah (string &&) = delete;' –
Hm. Và câu hỏi sau đó sẽ trở thành nếu 'const char'overload vẫn được yêu cầu. thông số 'char *' có liên kết với phiên bản 'chuỗi const &' hay phiên bản 'string &&' không? :-) –