nested namespaces



  • Hallo, wahrscheinlich 'ne eher dämliche Frage. Ich habe sonst immer Namensräume nicht zu Design-Zwecken genutzt sonder nur um Namen korrekt aufzulösen.
    In einem neuen Projekt soll ich aber folgendes tun:

    in Datei "/kit/msw/app.hpp"

    namespace kit{
      namespace msw{
        class Application{
        public:
          Application();
          ~Application();
        };
      }
    }
    

    in Datei "/kit/msw/app.cpp"

    namespace kit{
       namespace msw{
         Application::Application(){}
         Application::~Application(){}
       }
    }
    

    in Datei "/kit/app.hpp"

    namespace kit{
       class Application: public msw::Application
       {
          ...
       };
    }
    

    das bereit mir Bauchschmerzen. Bislang habe so etwas vermieden.

    Die IDE's(Code::blocks mit x86_64-w64-mingw32-g++, oder auch ab Visual Studio 2013)
    haben mit der Zeile: class Application: public msw::Application ein Problem. Der Namensraum msw ist keinem der Compiler bekannt.

    Bisher hätte ich dass z.B. immer so gelöst:

    class ApplicationMSW
    {
    public:
        ApplicationMSW();
        ~ApplicationMSW();
    };
    
    class ApplicationKIT: public ApplicationMSW
    {
    public:
        ApplicationKIT();
        ~ApplicationKIT();
    };
    
    class tt3: public ApplicationKIT
    {
    public:
        tt3();
        ~tt3();
    };
    

    Ich frage mich nur, warum ist bei den verschachtelten Namensräumen der msw-Namensraum den Compilern nicht bekannt. Dafür muss es doch einen Grund geben. Ich weiß es nicht. Das ich die verschachtelten Namensräume so nicht nutze hat sich bei mir durch Erfahrung gezeigt. Aber der Kunde hat wohl den google c++ style guide gelesen und findet das was dort steht total schick.

    Gruß



  • Hallo,

    die verschachtelten namespaces sind kein Problem. Aber vielleicht hast Du

    include "/kit/msw/app.hpp"
    

    in "/kit/app.hpp" vergessen? Oder Deine include-Guards in beiden Headern haben zufällig den gleichen Namen? Blöderweise heißen ja beide Header "app.hpp"? Ansonsten kann ich nur raten, Dein Code-Beispiel ist auf jeden Fall unvollständig.



  • Hallo,

    danke für die Antwort. Das war tatsächlich der Stupser in die richtige Richtung.
    Das hatte ich völlig übersehen, beim Durchblick auf den Code. Der erste Test des Original-Projekt hatte andere Include Guards, die ich händisch geändert hatte (genau weil eben die Header-Dateien gleiche Namen besaßen (<- IDE), die Unterscheidung sollte ja im Namensraum ersichtlich sein).
    Da ich die Vorgehensweise mit den Namensräumen "nicht schön fand", hatte ich mal ganz fix ein Testprojekt mit der Struktur erstellt, um es nochmal auf mich wirken zu lassen.
    Dabei ist mir dann der Fehler unterlaufen. Gleiche Guards...nix include, kein namespace msw.

    Danke 👍



  • Lass die lästigen include guards einfach weg und verwende stattdessen "#pragma once".
    Zumindest in meiner Lib mit mittlerweile fast 700 Klassen tue ich mir soetwas wie include guards nicht mehr an ;).

    https://en.wikipedia.org/wiki/Pragma_once

    Und "#pragma once" sollte gefühlt jeder Kompiler der die letzten 20 Jahre ein Update erfahren hat verstehen.



  • PragmaOnce schrieb:

    Und "#pragma once" sollte gefühlt jeder Kompiler der die letzten 20 Jahre ein Update erfahren hat verstehen.

    gefühlt ist aber eben ungleich standard...


Log in to reply