template definitionen



  • Hallo,
    eine kurze Frage, die sicherlich schnell zu beantworten ist. Wenn man eine Template-Klasse erstellt, muss man ja in der Header-Datei die entsprechende .cpp Dateien am Ende mit einfügen (#include "*.cpp").
    Wenn ich jetzt keine Template-Klasse, sondern nur eine Template-Methode habe muss ich dann nur die Definition der Methode am Ende einfügen oder auch wieder die kompletten Definitionen?
    Danke schonmal im Voraus
    Grüße



  • Also ich lege templates eigentlich immer so an:

    // .h
    template<typename T>
    class XYZ
    {
    private:
        T x;
    public:
        T foo(/***/)
        {
            /*
             *
             */
        }
    };
    
    template<typename T>
    T foo(/***/)
    {
        /*
         *
         */
    }
    

    oder ohne inline Definition:

    // .cpp
    #include "*.h"
    
    template<typename T>
    T XYZ::foo(/***/)
    {
        /*
         *
         */
    }
    
    template<typename T>        // im Header dann mir extern
    T foo(/***/)
    {
        /*
         *
         */
    }
    


  • Du mußt nur den Code der Template-Methode in der Headerdatei haben (bzw. in der von dort eingebundenen). Die restlichen (nicht-template) Methoden kannst du normal in die .cpp packen.

    Es geht ja nur darum, daß der Code der Template-Methoden/Funktionen zum Kompilieren zur Verfügung steht, alle anderen Methoden/Funktionen werden ja normal erst vom Linker zusammengebunden.



  • wäre es falsch die nicht-template-methoden auch mit einzubinden? also wenn ich alle definitionen in eine .cpp packe und dann mit #include am ende der header mit einbinde, oder sollte ich lieber template und nicht-template trennen?
    ich möchte in jedemfall der übersicht halber definition und deklaration in separaten dateien haben.



  • Ja, das wäre falsch, weil du dann die ODR (one definition rule) verletzen würdest (sobald die Headerdatei in mehreren Übersetzungseinheiten eingebunden werden würde).



  • jo, danke, hab ich auch gerade festgestellt. ich habs über präprozessorbefehle lösen können.


Anmelden zum Antworten