XX is not a namespace-name

  • C++

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von KidRick.

    XX is not a namespace-name

    Guten Morgen zusammen,

    ich weiß nicht ob ich auf dem Schlauch stehe oder ob ich es nicht verstehen will.

    Folgende Situation, ich habe eine MainWindow-Header-Datei:

    C-Quellcode

    1. namespace xx {
    2. class MainWindow : public QMainWindow {
    3. };
    4. }


    Eine MainWindow-Source-Datei:

    C-Quellcode

    1. using namespace xx;
    2. namespace xx {
    3. MainWindow::MainWindow()
    4. // usw
    5. }


    Eine Import-Header-Datei:

    C-Quellcode

    1. namespace xx {
    2. class Import : public QWidget {
    3. };
    4. }


    Sowie auch Import-Source-Datei:

    C-Quellcode

    1. using namespace xx;
    2. namespace xx {
    3. Import::Import()
    4. // usw
    5. }


    Wenn ich nun im MainWindow-Header folgendes mache:

    C-Quellcode

    1. namespace xx {
    2. class MainWindow : public QMainWindow {
    3. public:
    4. Import *import;
    5. };
    6. }


    funktioniert dies einwandfrei.

    Mache ich es aber genau andersherum:

    C-Quellcode

    1. namespace xx {
    2. class Import : public QWidget {
    3. private:
    4. MainWindow win;
    5. };
    6. }


    Bekomme ich erstmal die Meldung das MainWindow does not name a type. Verständlich. Also mache ich folgendes:

    C-Quellcode

    1. using namespace xx;
    2. namespace xx {
    3. class Import : public QWidget {
    4. private:
    5. MainWindow win;
    6. };
    7. }


    und bekomme prompt eine xx is not a namespace name Fehlermeldung.

    Wo hakt es hier? Übersehe ich etwas, oder ists einfach nur zu spät um nachzudenken ?(

    Grüße und frohes Fest
    Jan

    EDIT: Beide Header haben ein ​#include der jeweils gegenüberliegenden Seite (MainWindow hat include Import, Import hat include MainWindow).
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    2 Dinge hier:
    1. Verwende niemals unter keinen Unständen

    C-Quellcode

    1. using namespace ...;

    Es ist hässlich, nicht skalierbar und führt nur zu Mehrdeutigkeitsproblemen.
    Es gibt keinen einzigen Grund an den ich denken könnte das dies auf irgendeine weise nützlich ist BIS AUF, und jetzt kommt auch schon der einzige Grund wofür man das nutzen kann und sogar dazu gezwungen wird: Benutzerdefinierte Literale

    Das ist auch wirklich die einzig rechtfertigbare Nutzungsweise für dieses Konstrukt.

    Wenn du es aber verwendest nur um den Namespace nicht schreiben zu müssen, dann ist dies schlechtes code-design welches du nochmal überdenken solltest.

    Außerdem definierst du die Klasse sowieso im namespace in der Source datei, weshalb du es in erster linie sowieso nicht brauchst.

    Notiz: Bitte nimm das "schlechtes code-design" nicht als persönlichen Angriff, das geht eher auf Konventionen zurück.
    "gutes code-design" ist nicht dazu da um nur irgendeinem "standard" zu dienen, sondern tatsächlich um zukünftigen Problemen vorzubeugen.

    2. Inkludierst du die Header gegenseitig?
    Wenn ja, dann führt das zu sogenannten zirkularen Abhängigkeiten.

    Die sind erst mal nicht schlimm, allerdings falsch behandelt wird es absolut unvorherschaubar was dadurch alles ausgelöst werden kann, also auch komplett unverständliche Probleme die eigentlich gar nichts miteinander zu tun haben.

    Das Problem hier ist das der Präprozessor versucht den einen Header zu inkludieren und sieht das dieser Header den einen beinhaltet, heißt, der Header inkludiert sich selbst, immer und immer wieder.

    Um dem entgegenzutreten inkludierst du den einen Header in nur einem und im anderen machst du eine Vorwärtsdeklaration.
    (Ich spreche hier über Import und MainWindow, die scheinen diese Art von Relation zu haben)
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------