2013-05-13 2 views
8

Например:Как наследовать от std :: runtime_error?

#include <stdexcept> 
class A { }; 
class err : public A, public std::runtime_error("") { }; 
int main() { 
    err x; 
    return 0; 
} 

С ("") после runtime_error я получаю:

error: expected '{' before '(' token 
error: expected unqualified-id before string constant 
error: expected ')' before string constant 

еще (без ("")) Я получаю

In constructor 'err::err()': 
error: no matching function for call to 'std::runtime_error::runtime_error()' 

Что идет не так?

(Вы можете проверить его здесь: http://www.compileonline.com/compile_cpp_online.php)

ответ

13

Это правильный синтаксис:

class err : public A, public std::runtime_error 

И не:

class err : public A, public std::runtime_error("") 

Как вы делаете выше. Если вы хотите передать пустую строку в конструктор std::runtime_error, сделать это таким образом:

class err : public A, public std::runtime_error 
{ 
public: 
    err() : std::runtime_error("") { } 
//  ^^^^^^^^^^^^^^^^^^^^^^^^ 
}; 

Вот live example, чтобы показать код компиляции.

+1

Я попробовал это на http://www.compileonline.com/compile_cpp_online.php, и ваше предложение дает мне 'никакой подходящей функции для вызова 'std :: runtime_error :: runtime_error()'' – mchen

+0

@MiloChen: Are вы уверены, что правильно скопировали? Я добавил ссылку на живой пример, который показывает правильность компиляции кода. –

+1

О, я вижу, он не будет компилироваться, если я пропущу конструктор 'err(): std :: runtime_error (" ") {}'. Это не значит, что я * хочу * передать пустую строку - я * принудительно *. – mchen

Смежные вопросы