Das Semikolon aus einer anderen Welt
Dienstag, 25. Januar 2011 | Autor: Nico
#include "../../math/src/FInterpolation.hh" /** Interface class for seed lines such as lines, curves, polylines. */ class SeedCurve { public: virtual FPosition ipol(double t) = 0; virtual vector<FPosition> getPositions(positive number_of_seeds) = 0; };
gibt eine Fehlermeldung:
SeedLine.hh:9:1: error: multiple types in one declaration
Mehrere Typen in einer Deklaration.
Der Auslöser für diese Meldung ist simpel, aber vielleicht nicht offensichtlich: Nach der Deklaration eines neuen „Typs”, d.h. einer Klasse oder eines Structs, wurde das Semikolon vergessen - allerdings nicht an der Stelle, die die Fehlermeldung nennt! 😉
Wie bei vergessenen Semikolons üblich, wirkt sich der Fehler erst später im Code aus. Speziell bei Fällen wie diesem liegt die Ursache des Fehler oft sogar in einer ganz anderen Datei!
In unserem Beispiel sieht das so aus: Irgendwo #includen wir ein paar Header - unter anderem den, den uns die Fehlermeldung nennt:
#include "DCELHelper.hh" #include "SeedLine.hh"
Der Präprozessor löst die includes auf und macht daraus folgendes:
class DCELHelper { ... } class SeedCurve { public: virtual FPosition ipol(double t) = 0; virtual vector <FPosition> getPositions(positive number_of_seeds) = 0; };
und siehe da - hinter der Klasse DCELHelper fehlt das Semikolon! So ist’s besser:
class DCELHelper { ... }; // <-hier
In der Praxis ist die betreffende Stelle übrigens nicht sooo schwer zu finden, weil man ja in der Regel weiß „Ich habe gerade die Klasse Soundso geschrieben, jetzt kommt ein Fehler - naja, dann wird es wohl auch an eben der Klasse liegen.”
Update: Offenbar spucken neuere Versionen des GCC folgende, hilfreichere Fehlermeldung aus: error: expected ‘;’ after class definition
Das ist doch mal eine sinnvolle Neuerung! 🙂