Среда: Visual Studio 9, C ++ без управляемых расширений.
У меня есть сторонняя библиотека, которая экспортирует полностью специализированный шаблонный класс MyClass<42>
, определенный в MyClass.h.Он компилируется в загрузчик вспомогательных файлов .lib и .dll.Файл .lib содержит скомпилированный код для этой специализации и необходимые символы.MyClass.h выглядит следующим образом:
template<UInt D>
class MyClass {
public:
MyClass() {...};
virtual ~MyClass() {};
}
Теперь я хотел бы использовать эту библиотеку.Если я включу MyClass.h в Client.cpp, а затем скомпилирую его, я получу вторую копию этих символов в файле Client.obj.Я могу избавиться от этих символов, определив всех членов этой специализации как "extern".Мой Client.cpp выглядит так:
#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) {...}
Проблема в том, что я не могу избавиться от виртуального деструктора таким образом.Для виртуального деструктора я получаю почти стандартную ошибку LNK2005:
ThirdPartyd.lib(ThirdPartyd.dll) : error LNK2005:
"public: virtual __thiscall MyClass<42>::~MyClass<42>(void)"
(??1?$MyClass@$01@@@UAE@XZ) already defined in Client.obj
Что мне делать?