Syntax Error C2061
-
Danke für den Hinweis mit dem Fehler, dann ist mir jetzt auch klar, warum der Fehler C2061 heißt.
Die Fehlermeldung verweist auf das Code-Fragment der "B.h", in der die Funktion deklariert ist.class B{ void funktion(zA Variable); };
-
Dann solltest du mal überprüfen, obe der
typedef A *zA;auch vor der Klassendeklaration von B steht. (und im Zweifelsfall nachsehen, ob nicht irgendwelche Kreis-Includes die Reihenfolge durcheinanderbringen, von der du ausgehst)
-
Hallo CStoll,
was meinst Du denn mit Klassendeklaration und wo finde ich die? In der "B.h" steht doch die Klassendefinition von B, so hab ich das zumindest mal gelernt.
Und wenn ich die typedef A *zA; vor die Klassendefinition stehen hab bekomm ich einen Haufen Compilier-Fehler. Zu mal ich auch nicht verstehe, warum die typedef A *zA; nochmal irgendwo stehen muß, wenn die in der Header-Datei von A steht und diese in B included ist, müßte "zA" doch überall bekannt sein.
Und was sind denn Kreis-Includes, davon hab ich noch nichts gehört?
-
Ja, ich meinte die Definition der Klasse (manchmal bringe auch ich diese Begriffe noch durcheinander ;))
@Compiler-Fehler: Was für Fehler sind das genau?
@Kreis-Includes: Das bedeutet, daß sich zwei Header gegenseitig einbinden - wenn du in der B.h ein #include "A.h" und in der A.h ein #include "B.h" stehen hast, deutet das auf Probleme hin (im schlimmsten Fall beschwert sich der Compiler über eine zu große Include-Tiefe, nachdem er rekursiv 500 Exemplare von A.h und B.h ineinander eingebunden hat - bei Verwendung von Include-Guards wird diese Rekursion abgeschnitten, aber dafür landet womöglich die Definition von class A (und dein typedef) in der fertig präcompilten Datei HINTER die Definition von class B).
-
Also was die Compilierfehler angeht, die entstehen, wenn ich den 'typedef A zA;' auch nochmal in die 'B.h' vor die Klassendefinition von B schreib sind das etwa so an die 103. Diese setzen sich aus:
C2143: syntax error : missing ';' before ''
C2501: 'zA' missing storage-class or type specifiers
C2061: Syntax error: identifier 'zA'
C2371: 'A' redefinition, different basic types
C2378 'zA' redefinition, symbol cannot overloaded with a typdef
C2146: missing ';' befor identifier 'Variable'
zusammen. Daher hab ich das 'typedef A *zA;' aus der 'B.h' wieder entfernt, zu mal mir das auch nicht sinvoll erscheint.Was die Kreis-Includes angeht, da hab ich den folgenden Code
#ifndef _A_H #define _A_H . . . #endifgegen Mehrfacheinschluß für die 'B.h' und die 'A.h' verwendet, von daher sollte die rekursive Einbindung der Headerdateien unterbunden sein. Oder gibt's dafür noch andere besser Möglichkeiten? Das was ich verwende ist ja C++ und nicht Visual C++.
Ich hab gestern auch nochmal die Reihenfolge der 'includes' durchgesehen, dabei steht die 'A.h' immer vor der 'B.h'.
Ich hab auch nochmal ausprobiert in der 'B.cpp' die 'A.h' direkt zu includieren, dann bekomm ich aber zur Fehlermeldung C2061, auch noch
C2511: overloaded memberfunction Class A not found in class BWerd heute nochmal die includes etwas verändern in der Reihenfolge, vielleicht bringt mich das ja noch weiter. Ansonsten fällt mir so langsam auch nichts mehr ein.
@CStoll, danke für Deine bisherigen Tipps, hab dadurch schon einiges mehr gelernt.
-
Du mußt immer eins bedenken: Der Compiler ist "dumm" - und der Präprozessor ist noch dümmer. Die Auswertung der Präprozessor-Direktiven (#include, #ifndef,...) ist eine simple Textersetzung - und dadurch kommt nicht immer das raus, was du erwartest.
(und die Include-Guards sorgen auch nur dafür, daß ein Header nicht doppelt eingebunden wird - aber sie garantieren nicht die Reihenfolge).Beispiel gefällig?
//A.h #ifndef A_H #define A_H #include "B.h" class A{...}; #endif //B.h #ifndef B_H #define B_H #include "A.h" class B{...}; //main.cpp #include "A.h" #include "B.h" int main(){...}wird nach der Bearbeitung durch den Präprozessor zu
//#include "A.h" #define A_H //#include "B.h" #define B_H //#include "A.h" //leer //Ende #include class B{...}; //Ende #include class A{...}; //Ende #include //leer //#include "B.h" //Ende #include int main(){...}(Die Kommentare und Einrückungen sollen verdeutlichen, über welchen Weg was eingebunden wird)
Das bekommt der Compiler - und schon hast du ein Problem, weil bei der Definition von class B der Name A noch gar nicht bekannt ist.
Eventuell könnte es in deinem Fall helfen, wenn du in der B.h eine Forward-Deklaration für die Klasse A einfügst (anstelle des Headers A.h - den benötigst du erst in der B.cpp).
-
Hallo CStoll,
danke nochmal für diese ausführliche Erklärung und das Beispiel, wie eine Bearbeitung durch den Präprozessor aussehen kann.
Dem Tipp mit der Forward Deklaration werd ich gleich mal nachgehen, hab davon aber noch nichts gehört, vielleicht hilft mir das ja weiter.Hatte mir in der Zwischenzeit eine Header 'C.h' angelegt, in der die ganzen 'includes' stehen. In der 'B.cpp'. der 'A.cpp', der 'B.h' und der 'A.h' hab ich dann nur die die 'C.h' included, damit hab ich den Compiler-Fehler C2061 wohl soweit umgangen oder ausgeschaltet. Bekam beim Compilieren und Build keine Fehlermeldung mehr. Nur während der Ausführung des Programm, wenn ich die 'funktion( zA Variable)' ausführen will, bekomm ich jetzt einen 'Debug Assertion Failed'. Dabei wird auf den File: winocc.cpp Line 76 verwiesen.
Hab noch nicht rausbekommen was das genau ist.Naja werd mich jetzt erstmal um die Forward Deklaration kümmern, das scheint mich mit meinen Fähigkeiten schneller zur Lösung zu bringen.
-
Hallo,
das mit der Forward Deklaration klappt soweit auch, bekomm keine Fehlermeldung mehr beim Compiliren. Nur bei der Ausführung im Programm, bekomm ich auch wieder ein 'Debug Assertion Failed' und werd dabei auf den File: winocc.cpp Line 76 verwiesen, wenn ich die Funktion ausführen lassen will.
-
Dann solltest du mal dazusagen, über welchen Ausdruck der ASSERT() gestolpert ist ("Debug Assertion Failed" erhältst du, wenn jemand per ASSERT() kontrolliert hat, ob die Bedingungen für eine Funktion erfüllt sind - und offenbar ist das hier nicht der Fall).
Also schick das Programm mal durch den Debugger und schau dir an, wo der Fehler aufgetreten ist (und von wo in deinem Code du dorthin gelangt bist).
-
Also wenn ich mein Programm durch den Debugger schicke, zeigt er mir "Memory leaks" an mit irgendwelchen Zahlen und Klammern. Steht wohl dafür, wo ich das finde, hab noch nicht herraus gefunden was das genau bedeutet. Das tritt aber nur auf, wenn ich die 'funktion' aufrufe.
Das ganze hängt wohl damit zusammen das Speicher nicht wieder freigegeben wird. Über die Hilfe bin ich zu 'malloc' gelangt und versuche das nun weiter zu ergründen, bin da noch nicht zum Ende gekommen.