Template Klassen implementieren in Implementationsdateien



  • Hallo,

    ihr kennt ja die Aufteilung in Header Datei und C++ Datei. Diese scheint aber mit Templates nicht zu funktionieren.

    Wieso? Kann man da was machen?

    MfG Kenuk


  • Mod

    Kenuk schrieb:

    Wieso?

    Der technische Hintergrund ist, dass der konkrete Maschinencode für eine Templateinstanzierung erst erzeugt werden kann, wenn das Template instanziert wird. Vorher weiß man schließlich nicht, was in den Code genau rein muss. Folglich muss das Template selbst zur Zeit der Instanzierung in irgendeiner Form bekannt sein. Am einfachsten ist das, wenn es einfach in der Quellcodedatei vorliegt (oder indirekt im Header), wenn die Instanzierung erfolgt.

    Kann man da was machen?

    Nicht wirklich. Es gab mal im Sprachstandard einen Mechanismus für den Export von Templates. Der wurde von einem einzigen Compilerbauer nach jahrelanger Arbeit umgesetzt. Aber eher als ein proof-of-concept, dass es theoretisch machbar wäre, nicht weil es praktikabel ist. Daher ist der Mechanismus in der nächsten Standardrevision wieder raus geflogen, da nicht realistisch umsetzbar.



  • Achso danke, denn ich habe schon gegooglet und dort Lösungen ausprobiert, aber alle haben nicht funktioniert.



  • Wenn es einem lediglich um die Aufteilung in Deklarations- und Implemetierungs-Dateien geht, kann man das natürlich auch mit Templates machen (wenn auch etwas anders als mit der üblichen .hpp/.cpp-Kombination):

    function.hpp:

    template <typename T>
    T f(T x);
    
    void g();
    
    #include "function.inl"
    

    function.inl:

    template <typename T>
    T f(T x)
    {
        return x * x;
    }
    
    inline void g()
    {
        ...
    }
    

    So etwas sieht man durchaus schonmal etwas häufiger, und auch ich mache es ganz gerne so, da es trotz etwas mehr Tipparbeit die Header-Dateien übersichtlich hält (als "Referenz", was der Header so alles zur Verfügung stellt).
    Mit modernen IDEs, die ein gutes Template-Verständnis haben, sollte man allerdings überlegen, ob sich der Mehraufwand tatsächlich lohnt.

    Finnegan


Anmelden zum Antworten