g ++: const отбрасывает квалификаторы - PullRequest
8 голосов
/ 10 марта 2010

почему я получаю 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 на каждое возможное место.

Пожалуйста, просветите меня - я не понимаю ...

EDIT : Вот шаги для воспроизведения на Ubuntu-Carmic-32bit (g ++ v4.4.1)

  1. сохранить пример как customExc.cpp
  2. тип make customExc.o

РЕДАКТИРОВАТЬ : ошибка связана с CustomException. Класс Foo не имеет к этому никакого отношения. Поэтому я удалил его.

Ответы [ 4 ]

14 голосов
/ 10 марта 2010

CustomException::what звонки CustomException::code.CustomException::what - это метод const, о чем свидетельствует const после what().Поскольку это метод const, он не может делать ничего, что может изменить себя.CustomException::code не является методом const, что означает, что он не обещает не изменять себя.Поэтому CustomException::what не может вызвать CustomException::code.

Обратите внимание, что методы const не обязательно связаны с экземплярами const.Foo::bar может объявить свою переменную exc как неконстантную и вызывать методы const, такие как CustomException::what;это просто означает, что CustomException::what обещает не изменять exc, но другой код мог бы.

FAQ по C ++ содержит немного больше информации о const методах .

4 голосов
/ 10 марта 2010
   int code() const { return 42; }
3 голосов
/ 10 марта 2010

Ваша code() функция-член не объявлена ​​const. Вызов неконстантных функций-членов из константных функций-членов (в данном случае what()) недопустим.

Сделайте ваш code() член постоянным.

3 голосов
/ 10 марта 2010

Ваш what() является постоянной функцией-членом, но code() не является.

Просто измените code() на code() const.

...