Странная ошибка в «спецификации исключений переопределяющей функции более слабая, чем в базовой версии» в C ++ - PullRequest
0 голосов
/ 26 января 2020

Делая проект, я пытаюсь создать заголовок HandleError с кучей классов. Внутри моего класса BadNumber у меня есть метод / функция publi c, которая принимает в качестве строки type и num. Однако, когда я пытаюсь проверить это, я получаю сообщение об ошибке exception specification of overriding function is more lax than base version, потому что я наследую его от public std::exception. Я гуглил, как это исправить, и я рекомендую сделать вызов noexcept override в моем what() для этого вызова исключения ( ссылка здесь ). Пример почти идентичен моему с тем же сообщением об ошибке.

Код (компилируется с GCC / Clang c ++ 11):

#include <exception>
#include <string>

class BadNumber : public std::exception
{
    private:
        std::string _msg;
    public:
        BadNumber(std::string type, std::string num) : _msg(num + "is invalid type for " + type) {}
        const char *what() const noexcept override
        {
            return (_msg.c_str());
        }
};

Сообщение об ошибке:

src/../inc/HandleError.hpp:23:15: error: exception specification of overriding function is more lax than base version
                const char *what() const noexcept override
                            ^
/Library/Developer/CommandLineTools/usr/include/c++/v1/exception:102:25: note: overridden virtual function is here
    virtual const char* what() const _NOEXCEPT;

Я сделал то, что было задано, и провел некоторое исследование , но все же не повезло и все еще делает больше. Ваша помощь очень ценится, и всегда будет полезно получить некоторую обратную связь и по возможности конструктивно. Спасибо за ваше время и терпение :)

1 Ответ

0 голосов
/ 26 января 2020

Итак, я понял, что каждый класс должен быть виртуальным деструктором, потому что в противном случае я бы использовал базовый деструктор, чего я не хочу делать. Это мое решение:

class BadNumber : public std::exception
{
    private:
        std::string _msg;
    public:
        virtual ~BadNumber() throw() {return ;}
        BadNumber(std::string type, std::string num) : _msg(num + "is invalid type for " + type) {}
        virtual const char *what() const throw()
        {
            return (_msg.c_str());
        }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...