Definitionen von template-class-Funktionen

  • C++

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Elanda.

    Definitionen von template-class-Funktionen

    Guten Abend,

    mein kleines Anliegen ist etwas speziell. Es geht um Template-Klassen in C++, die sich in einer externen Bibliothek befinden. Packt man sie in eine Header-Datei, so muss man ja vom Prinzip her sämtliche Klassendefinitionen mit in die Header-Datei packen. Bei Klassen, die kein Template sind, packe ich die Funktionsdefinitionen immer in die *.cpp Datei.
    Templates sind äußerst nützlich, zwingen mich aber, von der mir gesetzten Regel abzuweichen, was ja auch erst mal logisch ist. Der Compiler muss ja zur Kompilierzeit wissen, für welchen Typ er die Klasse denn nun "ausstechen" soll. Gibt es Methoden, um davon irgendwie abzuweichen? Wahrscheinlich nicht, denn aus einer Template-Klassen-Definition, die sich schlussendlich in einer *.lib Bibliothek befindet, kann der Compiler/Linker keine vollständig typisierte (stenciled) Funktion mehr erstellen. Wie gesagt, etwas speziell, aber vielleicht hat ja jemand etwas Ahnung davon, wie der Compiler hier letzten Endes arbeitet.
    Doch, du kannst Template-Deklarationen auch in einer source Datei definieren, sofern du dort auch angibst für welche Typen diese valide sind.
    Das heißt, nehmen wir mal folgendes an:

    C-Quellcode

    1. template<class T>
    2. class MeineKlasse
    3. {
    4. void testFunktion();
    5. };


    Dann kannst die diese wie folgt in der cpp definieren:

    C-Quellcode

    1. // Hier die template-definition
    2. template class MeineKlasse<int>;
    3. // Hier die Funktionsdefinition
    4. template<class T>
    5. void MeineKlasse<T>::testFunktion()
    6. {}

    Das bedeutet aber, dass die Klasse `MeineKlasse` wirklich auch nur für `int` spezialisert ist.
    Oder in anderen Worten, wird die definition einer template-Klasse/Funktion oder jeglicher anderer Entität in eine TU-Datei delegiert, muss spezialisert werden welche jedwede sind.
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------
    Da kann ich dir nicht viel zu sagen, weder habe ich mit C++20 Modulen gearbeitet, noch plane ich das in Zukunft zu tun. :)
    Aber jede cpp-Datei, welche du zu deinem build hinzufügst, sollte als eigene TU fungieren. [es sei denn du inkludierst deine cpp-Dateien in anderen Einheiten (was natürlich nicht zu empfehlen ist)]
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------