开发者

g++: const discards qualifiers

why do I get a discard qualifiers error:

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

on the following code example

#include <iostream>


class CustomException: public std::exception {

public:

    virtual const char* what() const throw() {
        static std::string msg;
        msg  = "Error: ";
        msg += code();  // <---------- this开发者_如何学Go is the line with the compile error 
        return msg.c_str();
    }

    char code() { return 'F'; }
};

I have searched around on SOF before regarding simular issues.

I have already added a const on every possible place.

Please enlighten me - I don't get the point...

EDIT: here are the steps to reproduce on Ubuntu-Carmic-32bit (g++ v4.4.1)

  1. save example as customExc.cpp
  2. type make customExc.o

EDIT: The error is related to CustomException. The class Foo has nothing to do with it. So I have deleted it.


CustomException::what calls CustomException::code. CustomException::what is a const method, as signified by the const after what(). Since it is a const method, it cannot do anything that may modify itself. CustomException::code is not a const method, which means that it does not promise to not modify itself. So CustomException::what can't call CustomException::code.

Note that const methods are not necessarily related to const instances. Foo::bar can declare its exc variable as non-const and call const methods like CustomException::what; this simply means that CustomException::what promises not to modify exc, but other code might.

The C++ FAQ has a bit more information on const methods.


   int code() const { return 42; }


Your what() is a const member function, but code() is not.

Just change code() to code() const.


Your code() member function is not declared const. Calling non-const member functions from const member functions (what() in this case) is illegal.

Make your code() member const.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜