Будучи новичком в dll, я должен спросить всемогущего SO о чем-то.
Скажем, я явно создаю экземпляр класса шаблона следующим образом:
template class __declspec(dllexport) B<int>;
Как мне снова использовать импорт этого шаблонного класса?
Я пробовал добавить приведенный ниже код в свой файл .cpp, где я хочу использовать B
template class __declspec(dllimport) B<int>;
Ответ 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);
}