DLL und vollständig spezialisierte Vorlagenklasse

8

Umgebung: Visual Studio 9, C ++ ohne verwaltete Erweiterungen.

Ich habe eine Third-Party-Bibliothek, die eine vollständig spezialisierte Template-Klasse MyClass<42> exportiert, die in MyClass.h definiert ist. Es wird in eine .LIB- und eine DLL-Hilfsprogrammladedatei kompiliert. Die .lib-Datei enthält kompilierten Code für diese Spezialisierung und erforderliche Symbole. Die MyClass.h sieht folgendermaßen aus:

%Vor%

Jetzt möchte ich diese Bibliothek benutzen. Wenn ich die MyClass.h in eine Client.cpp einschließe und sie dann kompiliere, erhalte ich eine zweite Kopie dieser Symbole in der Client.obj-Datei. Ich kann diese Symbole loswerden, indem ich alle Mitglieder dieser Spezialisierung als "extern" definiere. Meine Client.cpp sieht so aus:

%Vor%

Das Problem ist, dass ich den virtuellen Destruktor auf diese Weise nicht loswerden kann. Für den virtuellen Destruktor bekomme ich einen fast standardmäßigen LNK2005 Fehler:

%Vor%

Was soll ich tun?

    
liori 17.02.2010, 21:49
quelle

2 Antworten

4

Es scheint, dass es für virtuelle Methoden notwendig ist, sie gleichzeitig als extern und __declspec(dllimport) zu definieren:

%Vor%

Das hat meinen Linker glücklich genug gemacht, meinen Code richtig zu verknüpfen.

Ich wäre sehr froh, wenn ein Experte beschrieben hätte, warum dies so ist, oder zumindest auf einen Artikel hingewiesen hat, der diesen Fall erklärt.

    
liori 20.02.2010, 17:58
quelle
1

Ich glaube, Visual Studio verwendet für einige STL-Konstrukte die Template-Spezialisierung in dlls. string kommt mir in den Sinn,

Ich habe mir die Header-Datei kurz angesehen und es sieht so aus, als würde sie

verwenden %Vor%

über die Erklärung einer Reihe von Spezialisierungen. Es scheint aber nicht so für die ganze Klasse zu sein.

Aus dieser Diskussion klingt es wie es möglich ist, die ganze Klasse als exportiert zu deklarieren, sagt aber nicht wie.

Entschuldigung für die nicht ganz vollständige Antwort, aber hoffentlich kann dies Ihnen helfen, andere Orte zu erkunden.

    
Bahbar 18.02.2010 10:09
quelle