Verschatelte Namensräume
-
Hi, ich habe folgenden code in einem Header:
namespace A{ namespace B{ class C: { }; }; };und in einer anderen Header das Hier:
namespace A{ class D: { A::B::C* m_C; //Problemzeile //B::C* m_C; //oder das hier geht auch nicht }; };Und bekomme beim Kompilieren 5 Fehler die verschwinden, wenn ich die Problemzeile auskommentiere:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C3083: 'B': the symbol to the left of a '::' must be a type error C2143: syntax error : missing ';' before '*' error C2039: 'C' : is not a member of 'A'Wie kann ich nun die Klasse C als Typ angebeben?
-
Zu viel Python programmiert?
class C: { };Da ist ein Doppelpunkt zu viel.
-
-
Ja, meh die Doppelpunkte bei C und D sind natürlich Tipfehler, cooky451 hat es korrigiert gepostet und compiliert auch, bei mir aber nicht und ich weis nicht wieso und wie ich schon sagte es läuft sobalt die Zeile auskommentiert ist.
-
du hast mehrere doppelpunkte, die falsch sind...
-
Ich rate mal ins Blaue und postuliere, dass du ein zirkuläre Abhängigkeit in deinen Headern hast, also die Header sich gegenseitig inkludieren...
-
Bingo!
Habe die falsche Header eingebunden, ich Pflaume.
Danke.
-
EinAnderer schrieb:
Bingo!
Habe die falsche Header eingebunden, ich Pflaume.
Danke.Stichwort forward-declaration. Für deine Pointer brauchst du garnichts einzubinden.
-
Wenn ich nun mehrere solcher Member hätte, sollte ich die alle "forward-declaration"?
-
Ja, dann beschleunigst du die Kompilierung du umso mehr. Wenn es wirklich viele sind, hilft auch ein Forward-Deklarations-Header (hat ein fwd für forward im Namen, Beispiel <iosfwd> aus der stdlib). Der sieht dann etwa so aus:
#ifndef H_ // include guard #define H_ namespace A { class A; class B : public A; class C; class D; } #endif
-
Ok, ich habe jetzt alles was ich Forward declartion konnte auch so gemacht.
Dafür muss ich dann in mehreren Anderen .cpp Dateien die entfernten Header includieren, ist das so sinnvoll und richtig? So gesehen sollte ich dann sogut wie nie Header in anderne Headern einbinden. Ausser welche mit Templates wie z.B. <vector> Richtig?
-
EinAnderer schrieb:
Dafür muss ich dann in mehreren Anderen .cpp Dateien die entfernten Header includieren, ist das so sinnvoll und richtig? So gesehen sollte ich dann sogut wie nie Header in anderne Headern einbinden. Ausser welche mit Templates wie z.B. <vector> Richtig?
Alles richtig. Dass du die Header jetzt öfter includieren musst, sieht nur auf den ersten Blick so aus. Du musst zwar öfter
#include "xyz.h"hinschreiben, aber tatsächlich wurde der Header vorher öfter eingebunden, weil der Präprozessor den überall mit reingenommen hat, wo der andere Header eingebunden wurde (und Header, die den anderen header eingebunden haben usw).Mit den Forward-declarations stellst du sicher, dass überall nur das eingebunden wird, was auch wirklich gebraucht wird.