doxygen und namespaces



  • Hallo,

    ich weiß nicht, wieviel Erfahrung Mitglieder hier mit doxygen haben,
    aber ich frag dennoch mal...

    also ich möchte meine C++-Dokumentation mit doxygen autogenerieren.

    Dabei schreibe ich die class-Beschreibung in ein hpp-file
    und die Methodenbeschreibungen in das zugehörige cpp-file.

    Nun habe ich verschachtelte namespaces
    und using-Deklarationen in der cpp-Datei
    und meine Methodendefinition sieht ungefähr so aus...

    template<int dim>
    classA<dim>::classA()
    {
    }
    

    Nun kann doxygen aber nicht die namespaces auflösen,
    es gibt ein Warning der Art

    warning: no matching class member found for
    template < dim >
    classA::classA()
    Possible candidates:
    namespace1::namespace2::classA< dim >::classA()

    Ich würde gerne meine using-Deklarationen beibehalten,
    denn an mancher Stelle wird der Code sonst zu breit
    oder zu lang...

    Danke im voraus
    und Gruß

    Rahul



  • Dann hast du aber die Namensbereiche in C++ falsch angewendet, wenn du einfach nur "using namespace X" an den Anfang deiner .cpp-Datei geschrieben hast.
    Du mußt schon die Klassen, Funktionen etc. in den entsprechenden Namensbereich packen und auch bei der Definition explizit angeben, d.h.

    // in header file
    namespace X
    {
      class Y
      {
        void Z();
      };
    }
    
    // in source file
    void X::Y::Z()
    {
    }
    

    Und dann erkennt doxygen das auch korrekt.

    Es ist natürlich einiges mehr an Schreibarbeit (und ich selber habe mich auch schon darüber aufgeregt, daß man nicht einfach auch im source file einfach "namespace X { ... }" schreiben kann.

    Vllt. kann 'camper' (oder einer der anderen ISO C++ Experten) mehr darüber schreiben, warum "using namespace X" alleine nicht ausreicht - auch wenn es meistens kompiliert!).

    P.S: Ich hoffe, du bist dir auch bewußt, daß wenn du templates innerhalb der .cpp-Datei definierst, diese dann nicht von außen benutzt werden können (also nur sinnvoll bei private-Deklaration).



  • Jo, danke für die Antwort,

    eigentlich wollte ich das vermeiden,

    ...und auch bei der Definition explizit angeben, d.h. ...

    denn wie oben erwähnt wirkt der Code für mich übersichtlicher
    und kompakter, wenn ich mit "using-Deklaration" abkürze...
    Ich hatte auch für mich als coding-style eingeführt,
    projekt-externe (z.B std:: ) Funktionen und Klassen IMMER mit namespace anzuführen, während projekt-zugehörige nur im Header mit namespaces beschrieben werden, in der cpp-datei aber nicht...

    Vllt. kann 'camper' (oder einer der anderen ISO C++ Experten) mehr darüber schreiben, warum "using namespace X" alleine nicht ausreicht - auch wenn es meistens kompiliert!).

    Jo, würde mich interessieren, wenn das nicht empfohlen wird,
    ein erklärender Link ist auch ok...
    Im meinem Fall - alternativ als Kompromiss denkbar - fände ich noch,
    an den Anfang die using-Deklarationen zu hauen und dann
    nur die "member function"-definitionen explizit mit namespaces aufzuführen.
    Weiß allerdings nicht, ob das klappt...

    P.S: Ich hoffe, du bist dir auch bewußt, daß wenn du templates innerhalb der .cpp-Datei definierst, diese dann nicht von außen benutzt werden können (also nur sinnvoll bei private-Deklaration).

    Am Ende der cpp-Datei instantiiere ich noch ein template per Makro explizit,
    aber anderes Thema...



  • Wenn es dir zuviel Arbeit macht, vor jede Funktionsdefinition ein namespace1::namespace2:: zu schreiben, kannst du auch die Namensräume wieder öffnen:

    namespace namespace1
    {
      namespace namespace2
      {
    
        template<int dim>
        classA<dim>::classA()
        {
        }
    
        //...
      }
    }
    

Anmelden zum Antworten