Использование экспортного ключевого слова с шаблонами - PullRequest
33 голосов
/ 24 марта 2011

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

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

Ответы [ 6 ]

40 голосов
/ 24 марта 2011

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

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

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

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

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

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

EDIT:

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

12 голосов
/ 24 марта 2011
5 голосов
/ 24 марта 2011

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

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

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

1 голос
/ 24 марта 2011

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

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

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

Вам лучше создавать экземпляры своих шаблонов.

0 голосов
/ 13 сентября 2013

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

0 голосов
/ 26 марта 2011

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

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

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