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

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


person Boyan    schedule 12.12.2008    source источник
comment
что вы подразумеваете под «явной спецификацией»? без создания шаблона?   -  person Paolo Tedesco    schedule 12.12.2008
comment
Без слов: класс шаблона MyTemplate‹int› и тому подобное в dll, где я определяю шаблон.   -  person Boyan    schedule 12.12.2008
comment
И что вы подразумеваете под «экспортом»? Ключевое слово С++ или экспорт функций в библиотеке типов?   -  person James Hopkin    schedule 12.12.2008
comment
Экспорт функций. Насколько мне известно, экспорт в компиляторах широко не поддерживается.   -  person Boyan    schedule 12.12.2008


Ответы (4)


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

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

person James Hopkin    schedule 12.12.2008
comment
Вот некоторая документация по экспорту классов шаблонов: support.microsoft.com/kb/168958 - person Laserallan; 23.07.2009
comment
за исключением vs6, который поддерживает такие вещи. Вот почему преобразование из VS6 в VS10 может вызвать ошибку для этого - person TripleS; 17.04.2012
comment
Это больше не актуально из-за изменений в С++ 11. - person Ident; 17.08.2015
comment
@Ident Можете ли вы уточнить это? - person camino; 29.03.2019
comment
@camino Прошло некоторое время, поэтому я не уверен, что имел в виду, но согласно en.cppreference.com/w/cpp/language/ вы можете сделать extern template class|struct для явного объявления инстанцирования. Как это будет работать без экспорта функций? - person Ident; 30.03.2019
comment
@Ident Спасибо за ссылку - person camino; 31.03.2019
comment
@Laserallan Ссылка плохая. Я нашел эту статью под названием HOWTO: Экспорт компонентов STL внутри и снаружи класса. - person Кое Кто; 12.12.2019

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

typedef std::vector<int> IntVec;

Обсуждается, как это сделать на: https://jeffpar.github.io/kbarchive/kb/168/Q168958/

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

person Laserallan    schedule 12.12.2008
comment
Ссылка плохая. Я нашел эту статью под названием HOWTO: Экспорт компонентов STL внутри и снаружи класса. - person Кое Кто; 12.12.2019

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

person Paolo Tedesco    schedule 12.12.2008

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

#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

person Peter Driscoll    schedule 24.09.2017