Ich habe eine DLL, die eine Vorlagenklasse enthält. Gibt es eine Möglichkeit, es ohne explizite Spezifikation zu exportieren?Wie exportiere ich Templates aus einer DLL ohne explizite Angabe?
Antwort
Da der Code für Vorlagen normalerweise in Kopfzeilen ist, müssen Sie die Funktionen überhaupt nicht exportieren. Das heißt, die Bibliothek, die die DLL verwendet, kann die Vorlage instanziieren.
Dies ist der einzige Weg, um Benutzern die Freiheit zu geben, jeden Typ mit der Vorlage zu verwenden, aber in gewissem Sinne funktioniert es gegen die Art, wie dlls funktionieren sollen.
Hier ist eine Dokumentation zum Exportieren von Vorlagenklassen: http://support.microsoft.com/kb/168958 – Laserallan
außer von vs6, die solche Sache unterstützt. Aus diesem Grund können Konvertierungen von VS6 zu VS10 einen Fehler verursachen – TripleS
Dies ist aufgrund von Änderungen in C++ 11 nicht mehr aktuell – Ident
Wenn der Compiler eine Instanz einer Vorlagenklasse wie MyTemplate <int> findet, wird der Code für die Vorlagenspezialisierung generiert.
Aus diesem Grund muss der gesamte Template-Code in eine Header-Datei eingefügt und dort eingefügt werden, wo Sie ihn verwenden möchten.
Wenn Sie Ihre Vorlagenklasse exportieren möchten, platzieren Sie Ihren Code einfach in eine Headerdatei und fügen Sie sie dort ein, wo sie benötigt wird.
Möchten Sie eine Instanziierung einer Vorlagenklasse über eine DLL exportieren? Eine Klasse entlang der Linien:
typedef std::vector<int> IntVec;
Es gibt einige Diskussion, wie diese auf tun: http://support.microsoft.com/kb/168958
Ein anderer Ansatz besteht darin, explizit jede Funktion exportieren Sie in durch eine Wrapper-Klasse interessiert sind, die gegen diese Vorlage Instanz . Dann werden Sie die DLL nicht mit mehr Symbolen durcheinander bringen, als Sie tatsächlich verwenden möchten.
In Ihrer Exportkontrolldatei.
#ifdef XXXX_BUILD
#define XXXX_EXPORT __declspec(dllexport)
#define XXXX_EXTERN
#else
#define XXXX_EXPORT __declspec(dllimport)
#define XXXX_EXTERN extern
#endif
Dabei ist XXXX_BUILD ein in Ihrem Projekt definiertes Symbol.
Um Ihre Klasse exportieren zu lassen.
Wo double ist der Typ, mit dem Sie die Klasse instanziieren möchten.
was meinst du mit 'explizite Spezifikation'? ohne die Vorlage zu instanziieren? –
Ohne zu sagen: "Template-Klasse MyTemplate" und dergleichen in der DLL, wo ich die Vorlage definieren. –
Boyan
Und was meinst du mit "Export"? Das Schlüsselwort C++ oder das Exportieren von Funktionen in einer Typbibliothek? –