Templates, using namespace, .cpp, .h



  • Aus Unwissenheit hatte ich damals die Impelementierung meiner Klassentemplates (oder waren es Template-Klassen?) jeweils in die .cpp geschrieben und dann explizite Template-Instanzierung (also z.B. "template class BCH<int>;") benutzt. Ich wollte jetzt den Inhalt der .cpp in die .h verschieben. Allerdings benutze ich in der .cpp auch "using namespace std;" und weitere. Wenn ich also einfach den Inhalt verschiebe, landet das "using namespace" nun auch in der Header-Datei, was man ja vermeiden sollte. Muss ich nun wohl oder übel das "using namespace" jeweils an den Anfang jeder Methode schreiben oder gibt es da elegantere Möglichkeiten?

    Und nochmal zum Verständnis: Die .cpp bleibt bei einem Klassentemplate quasi leer oder?



  • using direktiven gehören nicht in header dateien!
    Ende.

    sonst hebelst du das gesamte namespace system aus.
    zur not musst du deine klassen/methoden anpassen

    templates müssen zur compilerzeit komplett bekannt sein. deswegen ist die trennung auf header und quelldateien nicht möglich.

    Abhilfe schafft aber "extern" (oder wars export?) aus dem neuen Standard(?!)
    da kannst mal nach googlen wenn du es brauchst.

    was auch geht ist: du schreibst deine Dekalrationen in deinen header, deine Definitionen in eine *.impl und inkludierst diese *.impl datei nach deinen Deklarationen in die Header-Datei

    also so:

    // Foo.h
    template<class T>
    void func(T const& x);
    
    #include "Foo.impl"
    
    // Foo.impl
    
    template<class T>
    void func(T const& x)
    {
        x.foo();
    }
    

  • Mod

    Ramanujan schrieb:

    Muss ich nun wohl oder übel das "using namespace" jeweils an den Anfang jeder Methode schreiben oder gibt es da elegantere Möglichkeiten?

    Wenn das keine Monsterfunktionen sind, ist es möglicherweise kürzer, einfach qualifizierte Bezeichner zu verwenden. Bei längeren Namen bieten sich ggf. auch Namespacealiase an.

    Ramanujan schrieb:

    Und nochmal zum Verständnis: Die .cpp bleibt bei einem Klassentemplate quasi leer oder?

    Wenn sonst nichts zu definieren ist, ja - d.h. im Prinzip kannst du auf diese .cpp-Datai auch verzichten, weil sowieso kein Objektcode erzeugt wird.



  • Skym0sh0 schrieb:

    Abhilfe schafft aber "extern" (oder wars export?) aus dem neuen Standard(?!)

    Du meinst aus dem alten Standard. Im Neuen gibt es das nicht mehr.



  • echt jetzt?

    ich kann mich erinnern gelesen zu haben, dass es schwere Complicationen damit gibt und es deswegen kaum unterstützt wird...



  • Skym0sh0 schrieb:

    echt jetzt?

    ich kann mich erinnern gelesen zu haben, dass es schwere Complicationen damit gibt und es deswegen kaum unterstützt wird...

    Ja, deswegen wurde es ja aus dem aktuellen Standard entfernt.


Anmelden zum Antworten