Я пытаюсь определить некоторые классы, но я получаю некоторые ошибки, которые я не могу расшифровать. Я не понимаю, почему он утверждает, что я использую конструктор Test
когда я этого не делаю.
test.cpp: In constructor 'Test2::Test2(int)':
test.cpp:12:34: error: use of deleted function 'Test::Test()'
explicit Test2(const int line) {}
^
test.cpp:3:7: note: 'Test::Test()' is implicitly deleted because the default definition would be ill-formed:
class Test : public std::runtime_error {
^
test.cpp:3:7: error: no matching function for call to 'std::runtime_error::runtime_error()'
test.cpp:3:7: note: candidates are:
In file included from test.cpp:1:0:
C:/Development/MinGW/x86_64-w64-mingw32/include/c++/stdexcept:119:5: note: std::runtime_error::runtime_error(const string&)
runtime_error(const string& __arg);
^
C:/Development/MinGW/x86_64-w64-mingw32/include/c++/stdexcept:119:5: note: candidate expects 1 argument, 0 provided
C:/Development/MinGW/x86_64-w64-mingw32/include/c++/stdexcept:112:9: note: std::runtime_error::runtime_error(const std::runtime_error&)
class runtime_error : public exception
^
C:/Development/MinGW/x86_64-w64-mingw32/include/c++/stdexcept:112:9: note: candidate expects 1 argument, 0 provided
Минимальный рабочий пример (gcc 4.9.1, g++ -std=c++11
):
#include <stdexcept>
class Test : public std::runtime_error {
public:
virtual ~Test() noexcept {}
virtual const char * what() const noexcept = 0;
};
class Test2 : public Test {
public:
explicit Test2(const int line) {}
virtual const char * what() const noexcept { return ""; }
};
Ваш конструктор в классе Test2
не передает никаких аргументов базовому классу. Поэтому используется конструктор по умолчанию базового класса, который является Test
. И та же история с Test
then - его конструктор по умолчанию пытается вызвать конструктор по умолчанию своего базового класса - std::runtime_error
- который не существует. Отсюда и ошибка. Вам нужно передать аргумент строки сообщения в std::runtime_error
, например:
Test() : std::runtime_error("some message") {}
what
сети, и вообще не использоватьruntime_error
msgruntime_error
. Если бы я хотел вызвать базовый конструктор, я бы сделал это явно.runtime_error
. Возможно, ваш компилятор предоставил это как расширение. Если вы хотите иметь стандартный код, у вас нет выбора -runtime_error
не имеет конструктора по умолчанию, поэтому вы должны предоставить аргумент.