2014-03-27 9 views
9

Was bedeutet dieser Fehler? Wie kann ich es reparieren? Dies ist der Header-Code, der es verursacht hat:Looser Throw-Bezeichner in C++

class BadJumbleException : public exception { 
public: 
    BadJumbleException (const string& msg); // Constructor, accepts a string as the message 
    string& what();       // Returns the message string 
private: 
    string message;       // Stores the exception message 
}; 

Und dies ist der Quellcode:

BadJumbleException::BadJumbleException (const string& m) : message(m) {} 
string& BadJumbleException::what() { return message; } 

EDIT: Dies ist der Fehler:

looser throw specifier for 'virtual BadJumbleException::~BadJumbleException()

+0

Haben Sie den Fehler gepostet? – nwalsh

+1

was erklärt werden muss, um nichts zu werfen. – Flexo

+0

@Flexo was meinst du? – user2824889

Antwort

19

In C++ 03, per § 18.6.1/5, std::exception hat einen Destruktor, der so deklariert ist, dass keine Ausnahmen daraus ausgelöst werden können (a compilation error will be caused instead).

Die Sprache setzt voraus, dass, wenn Sie von einem solchen Typ ableiten, Ihre eigene destructor die gleiche Einschränkung haben muss:

virtual BadJumbleException::~BadJumbleException() throw() {} 
//            ^^^^^^^ 

Dies liegt daran, ein überwiegendes Funktion nicht lockerer Wurf Spezifikation haben.


In C++ 11, std::exception::~exception ist nicht markiert throw() (oder noexcept) explizit in dem Bibliothekscode, aber alle Destruktoren sind noexcept(true) standardmäßig.

Seit that rule would include your destructor and allow your program to compile, dies führt mich zu dem Schluss, dass Sie nicht wirklich kompilieren als C++ 11 sind.

+1

Kurz gesagt, wie ist dieser Fehler behoben? Warum funktioniert dieser Code in einigen anderen Projekten, aber nicht in diesem? – user2824889

+0

BTW wie macht ein throw() 'specifier Sinn auf einem Destruktor? Sie können sowieso keine Ausnahmen in Destruktoren werfen ... –

+0

@MatteoItalia: In C++ 03, ja, können Sie. Es beendet das Programm - zur Laufzeit. Daher verhindert 'throw()', dass Sie überhaupt in diesen Albtraum fallen. Und daher behebt C ​​++ 11 das Problem vollständig. –