Template Klasse als Lib



  • Hallo liebe Leute,

    ich habe eine generische Liste mittels Template geschrieben, die ich nun in eine statische Bibliothek überführen möchte.

    Nun habe ich aber lediglich ein Header-File Liste.h, in der die Deklaration und Definition der Methoden enthalten ist. Ein Auftrennen in .h und .cpp funktioniert nicht. Da bockt der Compiler. Den Hinweis dazu habe ich auch hier in der FAQ gefunden, dass wohl kaum ein Compiler bei Templates die Trennung frisst.

    Wie bekomme ich nun aber mit meinem VS 2010 die lib nur aufgrund der Liste.h hin?

    Kennt jemand auch ein Freeware Tool, um in DLLs oder Libs reinzuschauen, welche Funktionen exportiert werden? Leider ist da bei VS 2010 nichts mehr bei. Mit Herrn Google war ich da leider auch nicht erfogreich.

    Vielen Dank
    Uwe Homm



  • Ein template ist eine vorlage (für eine Klasse oder Funktion). Wird ein template instantiiert und Methoden verwendet, erzeugt der Compiler Code für diese eine Instantiierung, für die Methoden auch nur wenn sie tatsächlich gebraucht werden (ansonsten wird nur die Syntax geprüft).
    Daraus folgt: Der Compiler braucht IMMER den C++-Code. Eine .dll ist schon binär, wie soll der Compiler da an den C++-Code ran kommen?
    Eine template-Library kommt deshalb normalerweise als Header-Only-Lib ohne binaries daher. (Stroustrup hat anfangs eigentlich dieses Inclusion-Model nicht favorisiert, da aber alle anderen Modelle Probleme machten, blieb nur diese Lösung)



  • Hallo,

    danke erstmal für die Antwort!

    Wenn ich Dich richtig verstanden habe, geht das nicht, weil zur Compilezeit der jeweils verwendete Datentyp, der in den Container soll genannt sein muss?!

    Und daher kann ein Klassen-Template *nur* im Source verwendet werden?

    Hmmm, wie ist das dann bei der STL? Wenn ich dort den Vector oder die List verwende, kann ich ja auch den Datentyp angegeben. Oder liegen die tatsächlich nur im Quellcode bei? Habe ich noch nie nachgeschaut...

    Grüße
    Uwe Homm



  • Die STL meines GCC kommt in lesbaren Headern, ich nehme nicht an, dass der MSVC das anders macht. (Evtl. wird alles durch nen Obfuscator gejagt, dass man den Code nicht mehr ordentlich lesen kann).



  • Die werden im Quellcode vorliegen, ja. Es gibt allerdings die Möglichkeit, bestimmte Konkretisierungen einer Klassenvorlage in binärer Form vorzuhalten; das nennt sich dann explicit instantiation.

    Es gibt in der Standardbibliothek einige Klassen, die häufig auf diese Weise aus den dahinterliegenden Klassenvorlagen erstellt werden, beispielsweise std::string und std::wstring. Eine standardkonforme Implementation muss das nicht machen, aber es kann Vorteile haben (konkret kürzere Compilezeit und kleinere Binaries). Um andere, nicht binär vorgehaltene Konkretisierungen aus der Klassenvorlage zu erstellen, braucht man allerdings nach wie vor ihren gesamten Quellcode.



  • uhomm schrieb:

    [...] Da bockt der Compiler. Den Hinweis dazu habe ich auch hier in der FAQ gefunden, dass wohl kaum ein Compiler bei Templates die Trennung frisst.

    Siehe "one definition rule" in einem guten C++ Buch Deiner Wahl.



  • Nie jemand gar schrieb:

    Die STL meines GCC kommt in lesbaren Headern, ich nehme nicht an, dass der MSVC das anders macht. (Evtl. wird alles durch nen Obfuscator gejagt, dass man den Code nicht mehr ordentlich lesen kann).

    Bei MSVC ist auch nix verhunzt, die Standard-Library Header-Files kann man ganz normal lesen.



  • Vielen Dank für die Erläuterungen!

    Ich habe gestern dann auch gleich mal geschaut, ob die STL-Header den Code enthalten. Und wie bereits Hustbaer schreibt, liegen die auch bei VS2010 im lesbaren Source vor.

    Schöne Weihnachten!
    Uwe Homm


Anmelden zum Antworten