Compilerfehler
-
Hallo,
ich vollziehe gerade einige Codebeispiele aus Stroustrups Buch
Programming -- Principles and Practice Using C++ nach.
Gerade schaue ich mir ein Template an, um strings in andere Variablen zu konvertieren.
template <class T> T fromstring (const string& s ) { T result; istringstream is(s); if (!(is >> result)) throw bad_from_string(); return result; }Wie man unten sieht, wird die Konvertierung durch eine mögliche Exception abgesichert. Diese ist so definiert:
struct bad_from_string : std::bad_cast // Klasse, die Fehler bei der Umwandlung von Strings meldet { const char* what() const throw() // überschreibe what() von bad_cast { return "Gescheiterte Umwandlung von string"; } };Diese letzte Struktur macht dem Compiler allerdings Probleme (GCC 4.7.2 unter Fedora 17 ) die entsprechende Fehlermeldung lautet
/ Fehler: expected class-name before »{« tokenWeiß hier jemand Rat? Eigentlich sollte und müsste das anstandslos kompilieren
-
Header vergessen?
-
Deine 'bad_fromString' Klasse erbt privat von 'bad_cast', ichw eis nicht ob das der Fehler ist, aber das ist auf jedenfall nicht so gut.
-
Skym0sh0 schrieb:
Deine 'bad_fromString' Klasse erbt privat von 'bad_cast', ichw eis nicht ob das der Fehler ist, aber das ist auf jedenfall nicht so gut.
schau nochmal genau hin

Auf den möglicherweise fehlenden Header wurde schon hingewiesen.
-
Sag nicht bei struct ist auch die Vererbung default public?!
-
Skym0sh0 schrieb:
Sag nicht bei struct ist auch die Vererbung default public?!
Deshalb enthält tmp-code für gewöhnlich kein explizites public.
-
Okay... wusste ich nicht, aber jetzt wo du's sagst, eigentlich auch nicht mehr als logisch.
-
Alle die im lehrbuch auch eingebunden sind wurden eingebunden
Exception
Stdexcept
habs auch mal mit typeinfo versucht das gibt ganz irre fehlerWenn ihr mir sagt welche ich brauche gucke ich aber gerne noch mal
-
#include <typeinfo> fehlt vermutlich.
-
Ich hab mir den code noch mal angesehen.
Der Typeinfo header fehlt tatsächlich, führt aber auch nicht dazu dass das Programm kompiliert. Die genauen Fehlermeldungen habe ich gerade nicht zur Hand, da ich an einem Uni Rechner ohne Compiler sitze.Gefehlt hat aber wirklich eine Header-Datei. Stroustrup macht das in diesem Buch so, dass er dich ein wenig von der STL abschirmt, und seinen eigenen Header std_lib_facilities.h benutzt. Dort werden diese Header genutzt.
#include <fstream> #include <iostream> #include <stdexcept> #include <string> #include <sstream> #include <boost/regex.hpp>Wenn ich mal alles rausnehme, was der obige Code sicher nicht braucht, dann stellt sich heraus, dass das kompiliert, wenn man den Boost Header inkludiert. Ohne den geht nix. Frage an die Experten: Soweit ich das sehe, kompiliert die problematische STruktur deshalb nicht, weil sie von std::bad_cast erbt. Die Funktion ist aber doch wirklich in typeinfo defniert und sicher nicht bei boost, oder? Ich bin etwas verwirrt.
-
Um das zu beantworten, müsstest du mal die vollständige Fehlermeldung zeigen.
Du darfst aber davon ausgehen, dass dein Compiler recht hat.
-
Erst mal ein Tipp: ein vollständiges compilierbares (bzw. in dem Fall nicht compilierbares) Beispiel ist sehr hilfreich. Ich habe das mal so zusammen kopiert:
#include <string> #include <sstream> #include <typeinfo> struct bad_from_string : std::bad_cast { const char* what() const throw() // überschreibe what() von bad_cast { return "Gescheiterte Umwandlung von string"; } }; template <class T> T fromstring (const std::string& s ) { T result; std::istringstream is(s); if (!(is >> result)) throw bad_from_string(); return result; }Und siehe da - es lässt sich übersetzen.
Du kannst <typeinfo> offensichtlich deswegen durch <boost/regex.hpp> ersetzen, da dieser die <typeinfo> includiert.