Последствия использования std :: vector в экспортированной функции dll

У меня есть два dll-экспортируемых класса A и B. Объявление A содержит функцию, которая использует std :: vector в своей подписи, например:

<code>class EXPORT A{
 // ...
 std::vector<B> myFunction(std::vector<B> const &input);
};
</code>

(EXPORT - это обычный макрос для установки _declspec (dllexport) /_declspec (dllimport) соответственно.)

Читая о проблемах, связанных с использованием классов STL в интерфейсе DLL, я подытож

Использование std :: vector в интерфейсе DLL потребует компиляции всех клиентов этой DLL с одним и тем жеверси того же компилятора, потому что контейнеры STL не являются двоично-совместимыми. Еще хуже, в зависимости от использования этой DLL клиентами совместно с другими библиотеками DLL, «нестабильный» API DLL может сломать эти клиентские приложения, когда установлены обновления системы (например, пакеты Microsoft KB) (правда?).

Несмотря на вышесказанное, при необходимости std :: vector можно использовать в API DLL путем экспортаstd::vector<B> нравится

<code>template class EXPORT std::allocator<B>;
template class EXPORT std::vector<B>;
</code>

хотя это обычно упоминается в контексте, когда кто-то хочет использовать std :: vector как Член of A (http://support.microsoft.com/kb/168958)

В следующей статье службы поддержки Microsoft обсуждается, как получить доступ к объектам std :: vector, созданным в DLL, с помощью указателя или ссылки из исполняемого файла (http://support.microsoft.com/default.aspx?scid=kb;EN-US ; Q172396). Вышеупомянутое решение использоватьtemplate class EXPORT ...ажется, @ тоже применимо. Однако недостаток, подытоженный в первом пункте, кажется, остаетс

Чтобы полностью избавиться от проблемы, нужно обернуть std :: vector и изменить сигнатуруmyFunction, PIMPL и т.д ..

Мои вопросы:

Верно ли приведенное выше резюме или я что-то упустил?

Почему компиляция моего класса 'A' не генерирует предупреждение C4251 (класс 'std :: vector <_Ty>' должен иметь dll-интерфейс для использования клиентами ...)? У меня нет отключенных предупреждений компилятора, и я не получаю никаких предупреждений об использовании std :: vector вmyFunction в экспортированном классе А (с VS2005).

Что нужно сделать, чтобы правильно экспортироватьmyFunction в? Это реально просто экспортироватьstd::vector<B> и Б распределитель?

Какое значение имеет возврат значения std :: vector по значению? Предполагается, что исполняемый файл клиента был скомпилирован с другим компилятором (-version). Сохраняется ли проблема при возврате по значению, куда копируется вектор? Я думаю да. Аналогично для передачи std :: vector в качестве константы: мог получить доступ кstd::vector<B> (который может быть создан исполняемым файлом, скомпилированным с другим компилятором (-version)) может привести к возникновению проблем вmyFunction? Я думаю, да еще раз ..

Является ли последний пункт, указанный выше, действительно единственным чистым решением?

Большое спасибо заранее за ваш отзыв.

Ответы на вопрос(2)

Ваш ответ на вопрос