template funktionen auslagern



  • ich hab eine template klasse geschreiben. dessen funktionen-definitionen will ich nun auslagern, etwa so:

    myclass.h

    template<class T>
    class myClass{
    protected:
       T data;
    public:
       T getData() const;
    };
    

    myclass.cpp

    #include "myclass.h"
    
    T myClass<class T>() const{
       return data;
    }
    

    das problem ist nun habe ist, dass er mir in der cpp anzeigt, dass getData den unvollständigen typen 'T' zurückgibt.

    wie soll ich das denn sonst machen? funktioniert alles nicht:

    template<class T>T myClass<class T>() const{
       return data;
    }
    myClass<class T>::T myClass<class T>() const{
       return data;
    }
    
    ......
    ......
    


  • Ein Template ist nur eine Vorlage, auf deren Basis ein Typ oder eine Funktion generiert werden kann. Der Compiler muss die Definition des Template kennen, um es zu instanzieren. Du kannst eine Templatedefinition daher nicht in eine separate Datei auslagern ( extern wurde aus dem Standard entfernt). In jeder Übersetzungseinheit muss die vollständige Definition des Template bekannt sein. Mit anderen Worten: Templates müssen im Header definiert werden. Einzig eine konkrete Instanz eines Template kann man auslagern (Stichwort: extern template).



  • logisch aber mies 😕 bringt irwie mein komplettes konzept durcheinander..
    naja, mach ichs halt in die header.



  • Du könntest spezialized Templates machen, wenn Du die möglichen Ts kennst...



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • dot schrieb:

    Ein Template ist nur eine Vorlage, auf deren Basis ein Typ oder eine Funktion generiert werden kann. Der Compiler muss die Definition des Template kennen, um es zu instanzieren. Du kannst eine Templatedefinition daher nicht in eine separate Datei auslagern

    Streng genommen folgt das eine nicht aus dem anderen. Aber die ODR verlangt das nunmal so.

    dot schrieb:

    ( extern wurde aus dem Standard entfernt).

    Du meinst export . extern tut noch genau das, was es vorher auch schon tat. Zusätzlich bekommt man mit extern jetzt noch "extern templates". Das ist aber nicht dasselbe wie "exported templates", also für den OP nicht von besonderem Interesse. "extern templates" gibt es einzig und allein in der Hoffnung, Compile-Zeit zu reduzieren. Es ist das Gegenstück zur expliziten Instantiierung, mit der sich das automatische Instanziieren unterdrücken lässt.

    dot schrieb:

    [...] Einzig eine konkrete Instanz eines Template kann man auslagern (Stichwort: extern template).

    Ah, dann hast du dich vorhin doch wohl einfach nur vertippt.


Log in to reply