tại sao tôi nhận được một lỗi discard qualifiers
:g ++: const loại bỏ vòng loại
customExc.cpp: In member function ‘virtual const char* CustomException::what() const’:
customExc.cpp: error: passing ‘const CustomException’ as ‘this’ argument of ‘char customException::code()’ discards qualifiers
trên mã ví dụ sau
#include <iostream>
class CustomException: public std::exception {
public:
virtual const char* what() const throw() {
static std::string msg;
msg = "Error: ";
msg += code(); // <---------- this is the line with the compile error
return msg.c_str();
}
char code() { return 'F'; }
};
Tôi đã tìm kiếm xung quanh trên SOF trước về các vấn đề simular.
Tôi đã thêm const
vào mọi nơi có thể.
hãy soi sáng cho tôi - Tôi không nắm được vấn đề ...
EDIT: đây là các bước để tái tạo trên Ubuntu-Carmic-32bit (g ++ v4.4.1)
- tiết kiệm ví dụ như
customExc.cpp
- loại
make customExc.o
EDIT: Lỗi liên quan đến CustomException
. Lớp học Foo
không liên quan gì đến nó. Vì vậy, tôi đã xóa nó.
Nhân tiện, bạn không nên trả về 'msg.c_str()', vì 'msg' bị hủy ngay sau khi' what() 'trả về - có nghĩa là con trỏ sẽ không hợp lệ nữa khi người dùng đọc nó . Bạn có thể muốn xem xét xây dựng nó vào thời gian xây dựng và lưu trữ nó như là một thành viên trong lớp. –
@Raphael: Tôi biết. Tôi chỉ muốn giữ ví dụ đơn giản nhất có thể.Và - vì giá trị trả về của 'what()' là 'const' - nó không phải là một vấn đề trong thực tế. –
Tôi không thấy giá trị trả về 'what()' là 'const' phải làm gì với sự an toàn của việc trả về' msg.c_str() '... nó được bảo đảm trỏ đến bộ nhớ không tồn tại, đó là hành vi không xác định. đừng làm thế! – rmeador