Entorno: Visual Studio 9, C++ sin extensiones administradas.DLL y clase de plantilla totalmente especializada
Tengo una biblioteca de terceros que exporta una clase de plantilla totalmente especializada MyClass<42>
definida en MyClass.h. Se compila en un cargador auxiliar .lib y un archivo .dll. El archivo .lib contiene código compilado para esta especialización y los símbolos necesarios. El MyClass.h se ve así:
template<UInt D>
class MyClass {
public:
MyClass() {...};
virtual ~MyClass() {};
}
Ahora me gustaría utilizar esta biblioteca. Si incluyo MyClass.h en un Client.cpp y luego lo compilo, obtendré una segunda copia de estos símbolos en el archivo Client.obj. Puedo deshacerme de estos símbolos definiendo a todos los miembros de esa especialización como "externos". Mi Client.cpp se ve así:
#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) {...}
El problema es que no puedo deshacerse del destructor virtual de esta manera. Para el destructor virtual obtengo un error LNK2005 casi estándar:
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
¿Qué debo hacer?
+1 Me alegro de que incluso hayas dado una propina tan pequeña. – liori