Импорт явно созданного экземпляра класса шаблона из dll

Будучи новичком в dll, я должен спросить всемогущего SO о чем-то.

Скажем, я явно создаю экземпляр класса шаблона следующим образом:

template class __declspec(dllexport) B<int>;

Как мне снова использовать импорт этого шаблонного класса?

Я пробовал добавить приведенный ниже код в свой файл .cpp, где я хочу использовать B

template class __declspec(dllimport) B<int>;

person Nailer    schedule 20.03.2009    source источник
comment
Я пробовал добавить приведенный ниже код в свой файл .cpp, где я хочу использовать B, что вы узнали? вы получили ошибки? Вы можете вставить это в свой вопрос, что тогда произошло?   -  person Johannes Schaub - litb    schedule 20.03.2009
comment
вероятно, extern template class __declspec(dllimport) B<int>; подойдет.   -  person lav    schedule 24.07.2019


Ответы (2)


Когда вы полностью создаете экземпляр шаблона, у вас есть полный тип. Он ничем не отличается от любых других видов. Вам необходимо включить заголовок для B, а также привязать время компиляции к файлу lib или динамически загрузить dll для ссылки на определение.

Вы читали эту статью: http://support.microsoft.com/kb/168958?

Вот краткое изложение того, что я тестировал (и это сработало):


Создайте фиктивный проект DLL

  • Использовал мастер приложений консоли Win32 для создания заголовочных/исходных файлов dll с именем: template_export_test
  • Добавлено следующее:

файл: template_export_test.h


#ifndef EXP_STL
#define EXP_STL
#endif 

#ifdef EXP_STL
#    define DECLSPECIFIER __declspec(dllexport)
#    define EXPIMP_TEMPLATE
#else
#    define DECLSPECIFIER __declspec(dllimport)
#    define EXPIMP_TEMPLATE extern
#endif

EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>;

файл: template_export_test.cpp


template<class T>
CdllTest<T>::CdllTest(T t)
: _t(t)
{
    std::cout << _t << ": init\n";
}

Создайте тестовое приложение

  • Используйте мастер для создания консольного приложения Win32 с именем: driver
  • Edit the Linker project settings of this project:
    • Add to Linker > General > Additional Library Directories: path to template_export_test.lib
    • Добавить в компоновщик > Ввод > Дополнительные зависимости: template_export_test.lib
  • Включите template_export_test.h в основной файл cpp.

#include "c:\Documents and Settings\...\template_export_test.h"
using namespace std;

int main(int argc, char** argv) {
    CdllTest<int> c(12);
}

  • Скомпилируйте и вперед!
person dirkgently    schedule 20.03.2009
comment
Я пробовал: класс внешнего шаблона __declspec(dllimport) B‹int›; Не работает. - person Nailer; 20.03.2009
comment
Спасибо за ссылку. Однако я думаю, что ваш образец не работает правильно. #ifndef EXP_STL #define EXP_STL неверен и не соответствует предоставленной вами ссылке. - person Stuart Berg; 12.10.2011

Кажется, даже при явной инсталяции шаблона могут возникнуть проблемы, приводящие к ошибкам времени выполнения. Взгляните на эту интересную статью для C4251 (особенно "Заключение") .

person msi    schedule 16.10.2009