Действительно ли экспорт шаблона в MSVC приносит пользу? - PullRequest
4 голосов
/ 07 марта 2011

Когда вы создаете структуру в вашем открытом интерфейсе в MSVC, которая содержит шаблонный элемент данных, вы получите предупреждение во время компиляции.

Одним из решений является экспорт шаблонного типа в вашу DLL (см. эту статью KB).

Я задаю этот вопрос, потому что затрудняюсь понять, почему вы хотите экспортировать этот тип?

  1. Если вы не экспортируете его, в файлах .hpp достаточно информации, чтобы сгенерировать тип самостоятельно.

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

Какой смысл? Случай № 1 может вызвать сбои во время выполнения, если на самом деле есть две разные версии, которые компилятор считает одинаковыми, но № 2 может просто не загрузиться из-за пропущенных символов?

Я совершенно не в базе? На мой взгляд, лучший вариант - просто игнорировать предупреждения MSVC.

РЕДАКТИРОВАТЬ: Никто еще не указал на это, но я знаю и понимаю, что если у вас есть статика в ваших шаблонах, и вы хотите, чтобы эта статика была общей для всех применений вашей DLL внутри одного приложения: вы должны, в этом случае экспортируйте экземпляр шаблона. Это очень важно в случае синглтоноподобных объектов, регистраторов и т. П.

1 Ответ

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

#2 - это мгновенная смерть. Если вы хотите использовать стандартные типы в интерфейсе DLL, вы должны гарантировать, что используемый код а) динамически связан с одинаковыми библиотеками CRT и б) скомпилирован с одинаковыми заголовками.

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

...