abstrakte template klassen aus dll



  • hallo!

    ich habe ein großes problem und zwar habe ich in einer dll eine abstrakte template klasse (die cpp datei habe ich unten im header inkludiert) und folgende funktionien zum exportieren aus der dll

    template <class T> void CreateStack(IStack<T>** Interface);
    template <class T> void ReleaseStack(IStack<T>** Interface);
    template <class T> typedef void (*CREATESTACK)(IStack<T>* Interface);
    template <class T> typedef void (*RELEASESTACK)(IStack<T>* Interface);
    

    mit nicht templateklassen funktioniert das exportieren ja wunderbar, aber allerdings nicht mit template klassen, kann mir einer gründe dafür nennen? danke.



  • Hat es dir noch niemand gesagt? Templates in Dlls exportieren wird bis jetzt nicht unterstützt, aus welchen Gründen auch immer. Eigentlich gibt es das Schlüsselwort export, welches aber in praktisch keinem Compiler akzeptiert (ausser dem Comeau oder wie der heisst ?) wird (auch im neuen VC2005 nicht 😞 ). Das Problem ist, dass Templates bereits zur Compilezeit vom Compiler aufgelöst werden, d.h template<int> wird direkt als int gespeichert usw.. Die Symbole werden aufgelöst, und für jede Verwendung der Templates wird eine eigene Variante(also Klasse oder Funktion) generiert. Templates sind eine Art Makro. Du musst dir also etwas anderes einfallen lassen, um die Klassen zu verwenden.



  • das was du geschrieben hast wusste ich bereits, phoenix, aber danke trotzdem.

    ich weiss das es eigentlich (!) nicht geht, aber ich so viele tricks schon gesehen, aber alles so dermaßen kompliziert, vielleicht kann mir das irgendjemand mal genau erklären, ich weiss das es geht ja, aber nicht ganz genau wie.



  • edit: da die cpp datei ja noch am ende der headerdatei eingebunden wird, ist die klasse ja eigentlich nicht in der dll, oder hab ich da was falsch verstanden? so wurde es mir mal erklärt das ich es so machen sollte, jedoch komme ich jetzt nicht mehr weiter.



  • Du wolltest einen Trick wissen, hier ist einer:

    1. template-Funktion in den Header schreiben
    2. Die Klasse mit den template-Funktionen z.B. so definieren
    class EXPORT_CLASS Foo
    

    wobei EXPORT_CLASS z.B. so definiert wird:

    #ifdef MEINEDLL
    #define EXPORT_CLASS       __declspec(dllexport)
    #else
    #define EXPORT_CLASS       
    #endif
    

    MEINEDLL ist nur in der DLL selbst definiert



  • Möglicherweise gibt es da einige Hacks, mitdenen man "dynamische" templates bauen kann, jedoch kann ich dir dabei nicht wirklich helfen, da ich es noch nie gebraucht habe. Wenn du mir ein wenig Material über diese "Tricks" zeigst, kann ich dir vielleicht helfen.

    panda schrieb:

    edit: da die cpp datei ja noch am ende der headerdatei eingebunden wird, ist die klasse ja eigentlich nicht in der dll, oder hab ich da was falsch verstanden? so wurde es mir mal erklärt das ich es so machen sollte, jedoch komme ich jetzt nicht mehr weiter.

    Templateklassen werden nur implementiert, wenn du sie irgendwo verwendest. Das gilt auch für deren Memberfunktionen. Ist vermutlich auch der Grund, warum in neueren Entwicklungen (siehe .Net/Java usw) Generics eingeführt wurden, also eine Art Laufzeittemplates...

    @Monastero: Was soll das? Macht es einen Unterschied, ob er es direkt oder über Umwege als export deklariert? 🙄



  • #phoenix# schrieb:

    @Monastero: Was soll das? Macht es einen Unterschied, ob er es direkt oder über Umwege als export deklariert?

    Mit dem Exportieren wird dem Benutzer der DLL die Klasse verfügbar gemacht.
    Um diese Klasse dann für eine Anwendung nutzen zu können, muss sie in diese Anwendung importiert werden.
    Soweit so gut. Das Problem hier ist aber, soweit ich´s verstanden habe, dass template-Klassen strenggenommen zwar exportiert, nicht aber in einer anderen Anwendung importiert werden können. Daher wird das Symbol zum Exportieren gesetzt, das für´s Importieren nicht.
    Das war bisher für mich die einzige Lösung, mit der ich template-Klassen und deren Methoden exportieren und dann außerhalb der DLL auch nutzen konnte.


Anmelden zum Antworten