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 Artwarning: 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() { } //... } }