Templates in zwei Dateien - kein Standard?



  • Laut FAQ und allem anderen muss die Definition einer template-Memberfunktion ja in der gleichen Datei stehen wie die Deklaration. Bei VC++ .NET kann ich die Definition in dieser Form:

    template <class T>
    void obj<T>::foo(void){}
    

    schreiben, und auch problemlos kompilieren. Gehört das zum Standard oder ist das compilerspezifisch?



  • Die Definition von Memberfunktionen ausserhalb der Klasse hat nichts mit dem Verteilen über mehrere Dateien zu tun. Das kann genausogut im Header stehen ... muss es hier sogar.



  • Nein, das hier steht bei mir eben nicht im Header, sondern in der zugehörigen .cpp-Datei. (Mist, doch wieder das wichtigste im Post vergessen O_o)



  • Das sich das kompilieren läßt ist schon okay. Aber versuch es mal von einer anderen Übersetzungseinheit aus zu benutzen.



  • Nein, Standard ist das nicht. Das liegt daran, dass die Template ja erst zur Compilezeit konkretisiert wird.

    Es gibt laut Standard eine Möglichkeit, templates auf zwei Dateien zu verteilen, und zwar:

    //foo.h
    template <typename data_t> class foo {
      data_t bar();
    };
    
    //foo.tcc
    export template <typename data_t> data_t foo::bar() { data_t t; return t; }
    

    Das wird allerdings von nur sehr wenigen Compilern unterstützt, weil es bei modulweiser Kompilation eine ganze Menge Komplikationen aufwirft. Zum Beispiel, welche .cpp denn jetzt genommen werden soll. Die einfachste Variante ist wohl:

    //foo.h
    template <typename data_t> class foo {
      data_t bar();
    };
    
    #include "foo.tcc"
    

    ...und foo.tcc wie gehabt.



  • Oh, in einer anderen Übersetzungseinheit kann ich die Klasse zwar benutzen, aber nicht auf ihre Memberfunktion zugreifen. Hat sich damit also erledigt, danke. Und die export- und .tcc-Methoden kannte ich auch schon, hatte bloß gedacht, dass das bei mir jetzt auch anders funktionieren würde..


Anmelden zum Antworten