Ambiente: Visual Studio 9, C++ senza estensioni gestite.DLL e modello template completamente specializzato
Ho una libreria di terze parti che esporta una classe template completamente specializzata MyClass<42>
definita in MyClass.h. Viene compilato in un helper loader .lib e un file .dll. Il file .lib contiene il codice compilato per questa specializzazione e i simboli necessari. Il MyClass.h assomiglia a questo:
template<UInt D>
class MyClass {
public:
MyClass() {...};
virtual ~MyClass() {};
}
Ora mi piacerebbe utilizzare questa libreria. Se includo MyClass.h in un Client.cpp e poi lo compilo, otterrò la seconda copia di questi simboli nel file Client.obj. Posso sbarazzarmi di questi simboli definendo tutti i membri di quella specializzazione come "extern". Il mio Client.cpp assomiglia a questo:
#include <ThirdParty/MyClass.h>
extern template class MyClass<42>;
extern template MyClass<42>::MyClass<42>();
extern template MyClass<42>::~MyClass<42>();
void MyFunction(MyClass<42>& obj) {...}
Il problema è che non riesco a sbarazzarmi del distruttore virtuale in questo modo. Per il distruttore virtuale ottengo un errore LNK2005 quasi standard:
ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005:
"public: virtual __thiscall MyClass<42>::~MyClass<42>(void)"
([email protected][email protected]@@[email protected]) already defined in Client.obj
Cosa devo fare?
+1 Sono contento che tu abbia dato un suggerimento così piccolo. – liori