Namespace wird nicht gefunden ??
-
Hallo ich hab gerade irgendwie das Problem dass mein namespace ACore aus einer anderen Header datei trotz einbindung nicht erkannt wird. Ich hab in der Klasse ICore den Namespace ACore erstellt in welchem das enum IRESULT ist welches ich jetzt aus einer Headerdatei IModule als Rückgabetyp einer methode in der Klasse haben will. Mir ist was aufgefallen: Ich schreibe in IModule nur include ICore.h wo der namespace ist , binde IModule.h aber niergendwo anders ein-> kein Problem.
Wenn ich IModule jedoch in IModuleManager mit #include einbinde schreibt der mir, dass ACore keine klasse oder namespace in IModule ist.... warum ist das so ??Hier der Code: ICore.h
#pragma once .... #include "IModuleManager.h" namespace ACore { enum IRESULT { IOK = 0, ICANCELED = 1, IERROR = 2 };....IModuleManager.h
#pragma once #include "IModule.h" #include "ICore.h" class IModuleManager { public: IModuleManager(void); ~IModuleManager(void); ACore::IRESULT test() { return ACore::IOK; } };IModule.h
#pragma once #include "ICore.h" class IModule { public: IModule(void); ~IModule(void); virtual ACore::IRESULT Initialize() { return ACore::IOK;} virtual void Update() {} virtual ACore::IRESULT Terminate() {return ACore::IOK;} static int m_moduleID; // statischer int für globale nummerierung der ID für das Modul x };Ich bekomme so für IModuleManager und IModule die fehlermedlung das namespace ACore sei nicht vorhanden, wenn ich aus IModule#Manager das #include "IModule.h" entferne kommt für IModule keine Fehlermeldung wegen dem Namespace mehr
-
Ich Genius

IModuleManager wird ja vor dem Erstellen des namespaces eingebunden, ist also nicht vorhanden. Wie kann man das jetzt lösen ich müsste in ICore.h alle meine Header einbinden damit ich durch das einbinden von ICore.h in anderen Header dateien immer alle Manager und Systeme zugreifbar habe.
-
Du hast einen typischen "Cross-Include" erzeugt und das ist nicht kompilierfähig.
Es ist auch kein gutes Design einen Header für alles zu haben. Daher entferne einfach
#include "IModuleManager.h"aus deiner ICore.h und binde dann nur diejenigen Header in deinen Sourcen ein, die auch wirklich benötigt werden.
Als weiteres Stichwort noch: Vorwärtsdeklaration (forward declaration), falls du doch mal gegenseitig auf Klassen und/oder Funktionen zugreifen mußt.
-
Ja wahrscheinlich ist das auch so.Ich kenne forward declarations jedoch benutze ich das unique_ptr für die attribute der Klasse ICore und dann geht das nicht mehr, muss also die Klassen einbinden.
Naja ich mache das einfach anders von der Struktur dann geht das