У меня есть dll, которая содержит шаблонный класс. Есть ли способ экспортировать его без явного указания?
Как экспортировать шаблонные классы из dll без явного указания?
Ответы (4)
Поскольку код для шаблонов обычно находится в заголовках, вам вообще не нужно экспортировать функции. То есть библиотека, использующая dll, может создать экземпляр шаблона.
Это единственный способ дать пользователям свободу использовать любой тип с шаблоном, но в некотором смысле он работает против того, как должны работать библиотеки DLL.
Вы хотите экспортировать экземпляр класса шаблона через dll? Класс по строкам:
typedef std::vector<int> IntVec;
Обсуждается, как это сделать на: https://jeffpar.github.io/kbarchive/kb/168/Q168958/
Другой подход заключается в явном экспорте каждой интересующей вас функции через класс-оболочку, работающий с этим экземпляром шаблона. Тогда вы не будете загромождать dll большим количеством символов, чем вам действительно интересно использовать.
Когда компилятор находит экземпляр класса шаблона, такой как MyTemplate‹int›, он генерирует код для специализации шаблона.
По этой причине весь код шаблона должен быть помещен в заголовочный файл и включен в нужное место. чтобы использовать его.
Если вы хотите "экспортировать" свой класс шаблона, просто поместите свой код в заголовочный файл и включите его там, где это необходимо.
В вашем файле контроля экспорта.
#ifdef XXXX_BUILD
#define XXXX_EXPORT __declspec(dllexport)
#define XXXX_EXTERN
#else
#define XXXX_EXPORT __declspec(dllimport)
#define XXXX_EXTERN extern
#endif
где XXXX_BUILD — это символ, определенный в вашем проекте.
Чтобы ваш класс экспортировался.
XXXX_EXTERN template class XXXX_EXPORT YourClass<double>;
Где double — это тип, с которым вы хотите создать экземпляр класса.