Импорт явно экземпляра класса шаблона из dll - PullRequest
7 голосов
/ 20 марта 2009

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

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

template class __declspec(dllexport) B<int>;

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

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

template class __declspec(dllimport) B<int>;

Ответы [ 2 ]

5 голосов
/ 20 марта 2009

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

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

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


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

  • Использовал мастер приложения Win32 Console для создания заголовочных / исходных файлов 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
  • Редактировать настройки проекта Linker этого проекта:
    • Добавить в компоновщик> Общие> Дополнительные каталоги библиотеки: путь к 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);
}

  • Скомпилируйте и отправляйтесь!
0 голосов
/ 16 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...