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