Использование ключевого слова export с шаблонами

Как я могу понять ключевое слово "экспорт", которое можно использовать, чтобы можно было предоставить классы шаблонов или сигнатуры функций через заголовочный файл и абстрагировать фактическую реализацию в файле библиотеки. Может ли кто-нибудь предложить практическую примерную программу, которая показывает, как это сделать?
Есть ли недостатки или важные моменты, которые следует учитывать при использовании этого?

РЕДАКТИРОВАТЬ: Ответ на вопрос, основанный на ответах. Как упоминалось в ответах, "экспорт" устарел в С++ 0x и редко поддерживается компиляторами даже для С++ 03x. Учитывая эту ситуацию, каким образом можно скрыть фактические реализации в файлах lib и просто выставить объявления через заголовочные файлы, чтобы конечный пользователь мог знать, что является сигнатурами открытого API, но не имеет доступа к исходному коду, реализующему то же самое?

Ответ 1

Прежде всего: большинство компиляторов (включая gcc, Clang и Visual Studio) не поддерживают ключевое слово export.

Он реализован в одном интерфейсе: передним интерфейсом EDG и, таким образом, поддерживает только эти компиляторы (Comeau и icc). Отклики от разработчиков в EDG были чрезвычайно простыми: нам потребовалось время, было чрезвычайно сложно, мы не рекомендуем его реализовать (1), как следствие, он был сброшен в С++ 0x.

Теперь стандарт позволяет (и это реализуется как минимум gcc):

  • для объявления специализированной версии функции шаблона в заголовке
  • чтобы определить эту специализацию в одном исходном файле

и вести себя так, как вы ожидали бы от обычной функции.

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

EDIT:

(1) Наконец-то нашла ссылку Почему мы не можем позволить себе экспорт (PDF) Тома Плум, рассмотренный Стивом Адамчиком, John Spicer, и Daveed Vandevoorde из Edison Design Group, который изначально реализовал его в передней части EDG.

Ответ 3

Трудно предоставить примерную программу, потому что почти никакие компиляторы не поддерживают экспорт. g++ сообщит предупреждение о том, что он не поддерживается, а IIRC он даже не компилируется в Visual Studio. Кроме того, экспорт устарел в С++ 0x, что означает, что вряд ли будущие компиляторы его вообще поддержат.

Для обсуждения того, как использовать экспорт в нескольких компиляциях, которые его поддерживают (а именно Comeau С++), проверьте эту ссылку, в которой также говорится, почему экспорт трудно реализовать.

И приносим извинения, если это произойдет как серьезный антиэкспортный разбор. Я обещаю, что не ненавижу экспорт! Он просто не поддерживается широко, и вы не можете действительно полагаться на него как программиста.

Ответ 4

Причины, по которым многие производители компиляторов не поддерживали, - это то, что даже когда он работает, он не делает этого так, как ожидали программисты.

Лучшая статья, которую я нашел по вопросам, находится здесь:

http://msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx

Вам лучше создавать шаблоны.

Ответ 5

Я прочитал статью с заголовком, что-то вроде Export не поддерживается, и в любом случае вы не будете делать то, что хотите.

Единственный способ сделать то, что вы хотите, - полностью специализироваться, как было сказано. Но более того, если вы не видите исходный код библиотеки, вы не можете его скомпилировать. Это означает, что вы не можете принимать динамическую память, поскольку нет гарантии, что вы будете использовать соответствующее удаление для их нового. Например, если мой код отлаживается и библиотека освобождается, делетер не будет соответствовать новому. Вы можете использовать shared_ptr и предоставить удаляющему, но это TR1 и не имеет экспорта.

Ответ 6

С++ 11 теперь имеет "внешние шаблоны", которые уже хорошо поддерживаются современными компиляторами.