ошибка компоновщика (неразрешенный символ) с классом шаблона в DLL

Я получаю ошибку компоновщика — неразрешенный символ — при использовании (специализированного) шаблона класса из DLL (компилятор Visual Studio 2008). Я попытался использовать трюк «явного создания шаблона», описанный также здесь, в Stackoverflow, но он не сработал. Я разбил его на очень простой воспроизводимый пример:

У меня есть динамическая библиотека (DLL) «MyTemplates.lib» с файлом заголовка «MyTemplates.h» (и исходный файл «MyTemplates.cpp» без кода, который просто включает этот файл заголовка) со следующим содержимым:

template <class T>
class  A
{
public:
A()
{ int x = 7; }
};

template <class T>
class B : public A<T>
{
public:
B()
{}
};

// do explicit template instantiation for classes A<int> and B<int>
// macro 'MYTEMPLATES_API' is defined in the usual way as:
//#ifdef MYTEMPLATES_EXPORTS
//  #define MYTEMPLATES_API   __declspec( dllexport )
//#else
//  #define MYTEMPLATES_API  __declspec(dllimport)
//#endif
template class MYTEMPLATES_API A<int>;
template class MYTEMPLATES_API B<int>;

Теперь у меня есть другая динамическая библиотека UserLibary (которая ссылается на MyTemplates.lib) с файлами Util.h и Util.cpp. Файл ‘Util.h’ выглядит следующим образом:

#include "MyTemplates.h"
class UserClass
{
public:
UserClass();
public:
A<int> bla;
B<int> blubb;
};

и содержимое файла ‘Util.cpp’:

#include "Util.h"
UserClass::UserClass()
{
}

Проблема в том, что моя библиотека UserLibrary хорошо компилируется, но выдает две ошибки компоновщика следующим образом:

1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall B<int>::B<int>(void)" (__imp_??0?$B@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)
1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall A<int>::A<int>(void)" (__imp_??0?$A@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)

Поэтому компоновщик не может найти символы для конструкторов классов по умолчанию A<int> а также B<int>, Почему это возможно, и как я могу избавиться от этих ошибок компоновщика? Я думал, что экспликация шаблона экземпляра класса A<int> а также B<int> (в файле ‘MyTemplates.h’) решит эту проблему, но, к сожалению, это не помогает — или я использую это неправильно? Мой компилятор — Visual Studio 2008, операционная система — Windows 7 64-битная, а код скомпилирован в 64-битной.

0

Решение

В описании вашей проблемы не указано, зачем вам нужна эта DLL. Я бы просто разработал
библиотека заголовка только тогда, когда все в ней — шаблоны в любом случае. В результате нет необходимости импортировать
или экспортировать, просто #include если вам нужно что-то из этого.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]