Implicaciones del uso de std :: vector en una función exportada dll

Tengo dos clases A y B exportadas por dll. La declaración de A contiene una función que utiliza un std :: vector en su firma como:

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

(EXPORTAR es la macro habitual para poner en su lugar _declspec (dllexport) /_declspec (dllimport) en consecuencia.)

Al leer sobre los problemas relacionados con el uso de clases STL en una interfaz DLL, recojo en resumen:

El uso de std :: vector en una interfaz DLL requeriría que todos los clientes de esa DLL se compilen con el mismoversión del mismo compilador porque los contenedores STL no son compatibles con binarios. Lo que es peor, dependiendo del uso de esa DLL por parte de los clientes junto con otras DLL, la API DLL "inestable" puede interrumpir estas aplicaciones de cliente cuando se instalan actualizaciones del sistema (por ejemplo, paquetes de Microsoft KB) (¿en serio?).

A pesar de lo anterior, si es necesario, std :: vector se puede utilizar en una API de DLL mediante la exportaciónstd::vector<B> me gusta:

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

sin embargo, esto generalmente se menciona en el contexto cuando uno quiere usar std :: vector como unmiembro de A (http://support.microsoft.com/kb/168958).

El siguiente artículo de soporte de Microsoft explica cómo acceder a los objetos std :: vector creados en una DLL a través de un puntero o referencia desde el ejecutable (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). La solución anterior a utilizartemplate class EXPORT ... Parece ser aplicable también. Sin embargo, el inconveniente resumido en el primer punto parece permanecer.

Para deshacerse completamente del problema, uno tendría que ajustar std :: vector y cambiar la firma demyFunction, PIMPL etc.

Mis preguntas son:

¿Es correcto el resumen anterior, o echo de menos algo esencial?

¿Por qué la compilación de mi clase 'A' no genera la advertencia C4251 (la clase 'std :: vector <_Ty>' necesita tener una interfaz dll para ser utilizada por los clientes de ...)? No tengo desactivadas las advertencias del compilador y no recibo ninguna advertencia sobre el uso de std :: vector enmyFunction En clase exportada A (con VS2005).

¿Qué hay que hacer para exportar correctamente?myFunction ¿en un? ¿Es viable simplemente exportar?std::vector<B> y el asignador de B?

¿Cuáles son las implicaciones de devolver std :: vector by-value? Suponiendo un ejecutable cliente que se ha compilado con un compilador diferente (-version). ¿Persiste el problema cuando se devuelve un valor por donde se copia el vector? Supongo que si. Del mismo modo para pasar std :: vector como una referencia constante: podría acceder astd::vector<B> (que podría haber sido construido por un ejecutable compilado con un compilador diferente (-versión)) podría causar problemas dentro demyFunction? Supongo que sí otra vez ..

¿Es el último punto de la lista anterior realmente la única solución limpia?

Muchas gracias de antemano por sus comentarios.

Respuestas a la pregunta(2)

Su respuesta a la pregunta