为什么我会收到discard qualifiers
错误:
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
在以下代码示例
上#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'; }
};
在讨论类似问题之前,我已经搜索过SOF。
我已经在每个可能的地方添加了const
。
请赐教 - 我不明白......
修改: 以下是在Ubuntu-Carmic-32bit上重现的步骤(g ++ v4.4.1)
customExc.cpp
make customExc.o
编辑:错误与CustomException
有关。班级Foo
与此无关。所以我删除了它。
答案 0 :(得分:14)
CustomException::what
来电CustomException::code
。 CustomException::what
是一个const方法,由 what()
之后的const 表示。由于它是一个const方法,它不能做任何可能修改自身的事情。 CustomException::code
不是const方法,这意味着不承诺不修改自身。因此CustomException::what
无法调用CustomException::code
。
请注意,const方法不一定与const实例相关。 Foo::bar
可以将其exc
变量声明为非const,并调用const方法,如CustomException::what
;这只是意味着CustomException::what
承诺不会修改exc
,但其他代码可能会。
C ++ FAQ提供了有关const methods的更多信息。
答案 1 :(得分:4)
int code() const { return 42; }
答案 2 :(得分:3)
您的what()
是const成员函数,但code()
不是。
只需将code()
更改为code() const
。
答案 3 :(得分:3)
您的code()
成员函数未声明为const
。从const成员函数(在本例中为what()
)调用非const成员函数是非法的。
让你的code()
成员const。