Плохая форма конструктора и неявное удаление

0

Я пытаюсь определить некоторые классы, но я получаю некоторые ошибки, которые я не могу расшифровать. Я не понимаю, почему он утверждает, что я использую конструктор 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 ""; }
};
Теги:
default-constructor

1 ответ

1
Лучший ответ

Ваш конструктор в классе Test2 не передает никаких аргументов базовому классу. Поэтому используется конструктор по умолчанию базового класса, который является Test. И та же история с Test then - его конструктор по умолчанию пытается вызвать конструктор по умолчанию своего базового класса - std::runtime_error - который не существует. Отсюда и ошибка. Вам нужно передать аргумент строки сообщения в std::runtime_error, например:

Test() : std::runtime_error("some message") {}
  • 0
    Хорошо, это имеет смысл. Но я не хочу вызывать базовый конструктор, например, я могу захотеть вычислить, what сети, и вообще не использовать runtime_error msg runtime_error . Если бы я хотел вызвать базовый конструктор, я бы сделал это явно.
  • 1
    Насколько я знаю, в C ++ 98 также не было конструктора по умолчанию для runtime_error . Возможно, ваш компилятор предоставил это как расширение. Если вы хотите иметь стандартный код, у вас нет выбора - runtime_error не имеет конструктора по умолчанию, поэтому вы должны предоставить аргумент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню