Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: NailerОтветов: 2

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

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

template class __declspec(dllexport) B<int>;

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

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

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

c++templatesdll

Ответы

Ответ 1 · рейтинг 5 · dirkgently

Когда вы полностью создаете экземпляр шаблона, у вас есть полный тип. Он ничем не отличается от любых других видов. Вам необходимо включить заголовок для 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);
}

  • Скомпилируйте и вперед!

Ответ 2 · msi

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы