Implicações do uso de std :: vector em uma função exportada de dll

Eu tenho duas classes exportadas para dll A e B. A declaração de A contém uma função que usa um std :: vector em sua assinatura como:

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

(EXPORT é a macro usual para colocar em prática _declspec (dllexport) /_declspec (dllimport) em conformidade.)

Lendo sobre os problemas relacionados ao uso de classes STL em uma interface DLL, eu entendo em resumo:

Usando std :: vector em uma interface DLL exigiria que todos os clientes dessa DLL fossem compilados com o mesmoversão do mesmo compilador porque os contêineres STL não são binários compatíveis. Pior ainda, dependendo do uso dessa DLL pelos clientes conjuntamente com outras DLLs, a API DLL '' instável '' pode quebrar esses aplicativos cliente quando as atualizações do sistema são instaladas (por exemplo, pacotes Microsoft KB) (realmente?).

Apesar do acima, se necessário, o std :: vector pode ser usado em uma API DLL exportandostd::vector<B> gostar:

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

no entanto, isso geralmente é mencionado no contexto quando se quer usar std :: vector como ummembro de A (http://support.microsoft.com/kb/168958).

O seguinte artigo de suporte da Microsoft discute como acessar objetos std :: vector criados em uma DLL por meio de um ponteiro ou referência de dentro do executável (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). A solução acima para usartemplate class EXPORT ... parece ser aplicável também. No entanto, a desvantagem resumida no primeiro ponto parece permanecer.

Para se livrar completamente do problema, seria necessário quebrar std :: vector e alterar a assinatura demyFunction, PIMPL etc ..

Minhas perguntas são:

O resumo acima está correto ou eu sinto falta de algo essencial?

Por que a compilação da minha classe 'A' não gera aviso C4251 (a classe 'std :: vector <_Ty>' precisa ter a interface dll para ser usada pelos clientes de ...)? Eu não tenho nenhum aviso de compilador desligado e não recebo nenhum aviso sobre o uso de std :: vector emmyFunction na classe exportada A (com VS2005).

O que precisa ser feito para exportar corretamentemyFunction em um? É viável exportar apenasstd::vector<B> e o alocador de B?

Quais são as implicações de devolver o by-value std :: vector? Assumindo um executável do cliente que tenha sido compilado com um compilador (-version) diferente. O problema persistir ao retornar por valor em que o vetor é copiado? Eu acho que sim. Similarmente para passar std :: vector como referência constante: poderia acessarstd::vector<B> (que pode ser construído por um executável compilado com um compilador diferente (-version)) leva a problemas dentromyFunction? Eu acho que sim de novo ..

O último ponto listado acima é realmente a única solução limpa?

Muito obrigado antecipadamente pelo seu feedback.

questionAnswers(2)

yourAnswerToTheQuestion