Vom Benutzer erstellter Header verursacht C2061: Syntaxfehler: Bezeichner 'Klassenname'

7

Ich gehe davon aus, dass dies eine einfache Antwort sein wird, aber ich habe mich schon eine Weile damit beschäftigt und kann dieses Problem nicht beheben. Ich habe also eine bestimmte Klasse, Intersection , die, wenn sie in einem anderen Header enthalten ist, mir folgendes gibt:

error C2061: syntax error : identifier 'Intersection'

Dies ist meine Kreuzung Kopfzeile:

%Vor%

Wenn ich jetzt versuche, diese Klasse woanders zu verwenden, erhalte ich den Fehler. Zum Beispiel:

%Vor%

Insbesondere im Konstruktor Road (und in allen anderen Klassen, die Intersection referenzieren). Ich glaube nicht, dass es sich um ein Syntaxproblem handelt, da Coord eine andere Klasse ist, die auf die gleiche Weise definiert ist, und der Compiler (VS 2008) beschwert sich nicht darüber. Es ist nur Intersection im Besonderen, die mir dieses Problem bereitet. : /

Ich zeichne es Hausaufgaben - es ist, wofür es ist, obwohl dies nur ein Fehler ist, den ich nicht loswerden kann, anstatt ein Teil des Problems.

Gedanken?

    
kcoppock 29.06.2011, 02:27
quelle

1 Antwort

25

Es sieht so aus, als ob der Fehler darin besteht, dass Sie zwei Header-Dateien haben, die sich gegenseitig einschließen - intersection.h und road.h. Dies führt zu seltsamen Überraschungen in C ++, aufgrund der Funktionsweise von include guards. Angenommen, ich habe zwei Headerdateien, die wie folgt aussehen:

%Vor%

und

%Vor%

Wenn ich nun #include "A.h" versuche, dann expandiert es zu

%Vor%

Wenn ich versuche, #include "B.h" zu erweitern, bekomme ich folgendes:

%Vor%

An dieser Stelle wird der Präprozessor erneut versuchen, A.h zu erweitern, was zu folgendem führt:

%Vor%

Sehen wir uns jetzt an, was passiert, wenn wir all diese seltsamen Wächter aufräumen. Das erste Mal, wenn wir A sehen, wird es erweitert, wie es der Fall ist, wenn wir B zum ersten Mal erweitern. Wenn wir A zum zweiten Mal sehen, wird es jedoch nicht erweitert. Nachdem wir Kommentare und Präprozessordirektiven entfernt haben, erhalten wir den folgenden Code:

%Vor%

Beachten Sie, dass, wenn MyOtherFunction deklariert ist, A noch nicht deklariert wurde und der Compiler daher einen Fehler meldet.

Um dies zu beheben, können Sie A und B in den Header-Dateien, die sie benötigen, weiterleiten:

%Vor%

und

%Vor%

Jetzt gibt es keine kreisförmigen Abhängigkeiten mehr. Solange Sie #include die entsprechenden Header-Dateien in den .cpp-Dateien, sollten Sie in Ordnung sein.

Hoffe, das hilft!

    
templatetypedef 29.06.2011, 02:44
quelle

Tags und Links