Template in Header- und Source-Datei aufteilen



  • Hiho miteinander

    Irgendwie bring ich es einfach nicht hin, mein Template in 2 Dateien zu splitten (.h und .cpp)

    Wenn ich alles in der Header habe (also die funktionsrümpfe) dann kompiliert der richtig und ohne Fehler. Sobald ich aber das Zeugs aufsplitte dann mötzt der dass er die Funktionen nicht findet.

    #####################################
    LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall CILinkedList<class CItem>::CILinkedList<class CItem>(void)"
    #####################################

    In der cpp datei sieht das folgendermassen aus:

    #####################################
    template<class IItem>CILinkedList<IItem>::CILinkedList(void)
    {
    //Body
    }
    #####################################

    Sollte doch gehen oder? oder wie muss ich das sonst machen...?

    bc



  • Hallo,
    da muss ich dich leider entäuschen.
    Im Standard gibt es zwar das Schlüsselwort export, das das seperate Übersetzungsmodell auch für Templates möglich macht. Derzeit gibt es aber so gut wie keinen Compiler der dies unterstützt.

    Prinzipiell würde das ganze so aussehen:

    // A.h
    export template <class T>
    class A
    {
         public:
             void Func();
             //...
    };
    
    // A.cpp
    #include "A.h"
    template <class T>
    void A::Func() {}
    

    Solange dies aber nicht von den Compilern unterstützt wird, wird dir nichts anderes übrigbleiben als die Definitionen in den Header zu schreiben. Alternativ kannst du auch eine extra Datei verwenden, die du dann als letztes in den Header inkludierst. Solchen Dateien spendiert man in der Regel Endungen wie .inl oder .ipp.

    Informationen zum Thema Export gibt es hier:
    Herb Sutter: "Export" Restrictions, Part 1
    Herb Sutter: "Export" Restrictions, Part 2
    Why We Can’t Afford Export


Anmelden zum Antworten