Как экспортировать шаблонные классы из DLL без явной спецификации?

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

12.12.2008 13:55:59
что вы имеете в виду под «явной спецификацией»? без создания шаблона?
Paolo Tedesco 12.12.2008 13:58:05
Не говоря: «шаблон класса MyTemplate <int>» и тому подобное в DLL, где я определяю шаблон.
Boyan 12.12.2008 14:08:17
И что вы подразумеваете под «экспорт»? Ключевое слово C ++ или функции экспорта в библиотеку типов?
James Hopkin 12.12.2008 14:08:57
Экспортные функции. Насколько я знаю, "экспорт" не поддерживается широко в компиляторах.
Boyan 12.12.2008 14:10:03
4 ОТВЕТА
РЕШЕНИЕ

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

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

17
19.04.2012 09:56:48
Вот некоторая документация по экспорту шаблонных классов: support.microsoft.com/kb/168958
Laserallan 23.07.2009 14:46:59
кроме vs6, который поддерживает такую ​​вещь. Вот почему преобразования из VS6 в VS10 могут вызвать ошибку
TripleS 17.04.2012 06:38:05
Это больше не актуально из-за изменений в C ++ 11
Ident 17.08.2015 14:36:15
@Ident Можете ли вы уточнить это?
camino 29.03.2019 13:13:33
@camino Прошло некоторое время, поэтому я не уверен, на что я ссылался, но в соответствии с en.cppreference.com/w/cpp/language/… вы можете сделать "extern template class | struct" для явного объявления экземпляра. Теперь, как это будет работать без экспорта функций?
Ident 30.03.2019 20:11:56

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

3
12.12.2008 14:27:06

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

typedef std::vector<int> IntVec;

Как это сделать, обсуждают: http://support.microsoft.com/kb/168958.

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

5
12.12.2008 14:35:25
Ссылка плохая. Я нашел эту статью под названием «HOWTO: Экспорт компонентов STL внутри и вне класса».
Кое Кто 12.12.2019 11:45:30

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

#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

0
24.09.2017 17:15:33