C++ Unklare Meldung: "error: changes meaning of ‘Test’ from ‘class Test"

r34ln00b

Lt. Commander
Registriert
Feb. 2006
Beiträge
1.096
Hallo zusammen,

ich habe hier ein Projekt mit mehreren cpp- und hpp-Dateien. Nun ist mir ein Fehler aufgefallen, wenn ich das Projekt mit g+ kompiliere. Der Fehler ist mir erst jetzt aufgefallen, da ich eigentlich clang++ nutze und durch Zufall den g++ aufrief.
Während clang++ ohne Meldung kompiliert und das Programm (wie erwartet läuft), spuck mir der g++ folgende zwei Meldungen aus:
Code:
error: declaration of ‘Test* Test::Test’
und
Code:
error: changes meaning of ‘Test from ‘class Test’
Des Weiteren kann der g++ auch Code kompilieren, wenn ich das Flag
Code:
-fpermissive
setze, wobei dann natürlich Warnungen anstelle der Error angezeigt werden.
Ich bin nun ein wenig verwirrt, wo der Fehler und was die Ursache ist und weiß nicht genau, was ich dagegen unternehmen kann.
Ich versuche die Situation möglichst abstrakt zu schildern, bei Unklarheiten bitte fragen.
Konkret bemängelt wird (soweit ich das schließen kann) ein Pointer. In einer Klasse Test_D sind zwei Pointer enthalten: Ein Verweis auf Test
Code:
Test* test;
und ein weiterer Verweis auf Test_D
Code:
test_d* Test_D;
.
Bei den g++-Ausgaben bezieht sich eine Error-Meldung auf die Deklaration in Test_D. Die Error-Meldung
Code:
changes meaning of <xx> from <class xx>
bezieht sich auf die Klasse Test.

War ich verständlich genug? Kann mich jemand aufklären, was ich falsch mache?
Ergänzung ()

Okay, jetzt saß ich eine längere Zeit an dem Problem, hatte mich entschlossen doch mal das CB-Forum zu fragen und kurz danach hat sich das Problem erledigt.
Ein Hinweis In C++ you cannot name a function the same name as a class/struct/typedef. hat es getan.
Ich denke nicht, dass der Thread sehr hilfreich oder nützlich ist. Wie kann ich diesen Thread löschen?

Grüße
 
Zuletzt bearbeitet:
Das Problem war demnach, dass du eine Methode der Klasse Test definiert hast, die ebenfalls Test (bzw. Test::Test()) hieß, ohne der Konstruktor der Klasse Test zu sein?

Das ist doch etwas durchaus interessantes, das auch für andere relevant sein könnte. Der Thread darf also ruhig weiterexistieren ;)
 
War wohl eher eine Member-Variable, denn mit Methoden lässt auch clang das ganze nicht durchgehen:
Code:
error: constructor cannot have a return type

Aber das hier ist so ein Grund, warum viele Projekte Code-Konventionen verwenden, die das von vornherein verhindern. Variablennamen grundsätzlich klein schreiben und fertig.
 
Ich finde gerade bei sowas ist clang gcc haushoch überlegen. Ich hatte mal einen Bug, g++ hat mir TAUSENDE von Fehlern bezüglich extrem verschachtelten Templates ausgegeben (auch die Standardlib betreffend).

clang++ hat mir genau 2 Fehler angezeigt: Schau doch mal in der Datei so und so, ich glaube du hast da die Reihenfolge vertauscht.

Und genau das wars. Seitdem nutze ich auf Linux/Unix nur noch clang wenn ich die Möglichkeit habe. Diese wahnsinnig präzisen Fehlermeldungen sind einfach durch nichts zu ersetzen.
 
Zurück
Oben