Как экспортировать шаблонные классы из DLL без явной спецификации? - PullRequest
13 голосов
/ 12 декабря 2008

У меня есть DLL, которая содержит шаблонный класс. Есть ли способ экспортировать его без явной спецификации?

Ответы [ 4 ]

17 голосов
/ 12 декабря 2008

Поскольку код для шаблонов обычно находится в заголовках, вам вообще не нужно экспортировать функции. То есть библиотека, использующая dll, может создать экземпляр шаблона.

Это единственный способ дать пользователям возможность использовать любой тип с шаблоном, но в некотором смысле он работает против способа, которым должны работать dll.

5 голосов
/ 12 декабря 2008

Вы ищете экспорт экземпляра класса шаблона через dll? Класс по линии:

typedef std::vector<int> IntVec;

Существует обсуждение, как это сделать: http://support.microsoft.com/kb/168958

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

3 голосов
/ 12 декабря 2008

Когда компилятор находит экземпляр класса шаблона, например MyTemplate , он генерирует код для специализации шаблона.
По этой причине весь код шаблона должен быть помещен в заголовочный файл и включен там, где вы хотите его использовать.
Если вы хотите «экспортировать» свой шаблонный класс, просто поместите свой код в заголовочный файл и включите его там, где это необходимо.

0 голосов
/ 24 сентября 2017

В вашем файле контроля экспорта.

#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 - это тип, с которым вы хотите создать экземпляр класса.

https://support.microsoft.com/en-us/help/168958/how-to-export-an-instantiation-of-a-standard-template-library-stl-clas

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