2013-05-13 9 views
8

Zum Beispiel:Wie vererbt man von std :: runtime_error?

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

Mit ("") nach runtime_error ich:

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

sonst (ohne ("")) Ich bekommen

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

Was falsch läuft?

(Sie können es hier testen: http://www.compileonline.com/compile_cpp_online.php)

Antwort

13

Dies ist die korrekte Syntax:

class err : public A, public std::runtime_error 

Und nicht:

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

Wie Sie oben tun. Wenn Sie eine leere Zeichenfolge an den Konstruktor std::runtime_error übergeben wollen, tun Sie es auf diese Weise:

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

hier ein live example ist Kompilieren des Codes zu zeigen.

+1

Ich habe versucht es auf http://www.compileonline.com/compile_cpp_online.php, und Ihr Vorschlag gibt mir 'keine passende Funktion für den Aufruf von 'std :: runtime_error :: runtime_error()'' – mchen

+0

@MiloChen: Are Bist du sicher, dass du alles richtig kopiert hast? Ich habe einen Link zu einem Live-Beispiel hinzugefügt, das zeigt, dass der Code korrekt kompiliert wird. –

+1

Oh, ich sehe, es wird nicht kompiliert, wenn ich den Konstruktor 'err() verpasse: std :: runtime_error (" ") {}'. Es ist nicht so, dass ich eine leere Zeichenfolge weitergeben möchte - ich bin gezwungen. – mchen

Verwandte Themen