g ++:const丢弃限定符

时间:2010-03-09 21:12:57

标签: c++ g++ const

为什么我会收到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)

  1. 将示例另存为customExc.cpp
  2. 输入make customExc.o
  3. 编辑:错误与CustomException有关。班级Foo与此无关。所以我删除了它。

4 个答案:

答案 0 :(得分:14)

CustomException::what来电CustomException::codeCustomException::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。