Implikacje użycia std :: vector w funkcji eksportowanej dll

Mam dwie klasy eksportowane przez dll A i B. Deklaracja A zawiera funkcję, która używa sygnatury std :: vector w następujący sposób:

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

(EXPORT to zwykłe makro, które należy umieścić _declspec (dllexport) /_declspec (dllimport) odpowiednio.)

Czytając o problemach związanych z używaniem klas STL w interfejsie DLL, zbieram podsumowanie:

Użycie std :: vector w interfejsie DLL wymagałoby skompilowania wszystkich klientów tej biblioteki DLL z tym samymwersja tego samego kompilatora, ponieważ kontenery STL nie są kompatybilne binarnie. Co gorsza, w zależności od użycia tej biblioteki DLL przez klientów wspólnie z innymi bibliotekami DLL, interfejs API „niestabilny” może złamać te aplikacje klienckie po zainstalowaniu aktualizacji systemu (np. Pakietów KB firmy Microsoft) (naprawdę?).

Pomimo powyższego, jeśli jest to wymagane, std :: vector może zostać użyty w API DLL poprzez eksportstd::vector<B> lubić:

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

jest to jednak zazwyczaj wymieniane w kontekście, gdy użytkownik chce użyć std :: vector jako aczłonek z A (http://support.microsoft.com/kb/168958).

Poniższy artykuł pomocy technicznej firmy Microsoft omawia sposób uzyskiwania dostępu do obiektów std :: vector utworzonych w bibliotece DLL za pomocą wskaźnika lub odwołania z poziomu pliku wykonywalnego (http://support.microsoft.com/default.aspx?scid=kb;EN-US; Q172396). Powyższe rozwiązanie do użyciatemplate class EXPORT ... wydaje się, że ma również zastosowanie. Jednakże wada podsumowana w pierwszym punkcie wydaje się pozostać.

Aby całkowicie pozbyć się problemu, należałoby zawinąć std :: vector i zmienić sygnaturęmyFunction, PIMPL itp ..

Moje pytania to:

Czy powyższe podsumowanie jest poprawne, czy brakuje mi tutaj czegoś istotnego?

Dlaczego kompilacja mojej klasy „A” nie generuje ostrzeżenia C4251 (klasa „std :: vector <_Ty>” musi mieć interfejs dll do użycia przez klientów…)? Nie mam wyłączonych ostrzeżeń kompilatora i nie otrzymuję żadnego ostrzeżenia na temat używania std :: vector wmyFunction w wyeksportowanej klasie A (z VS2005).

Co należy zrobić, aby poprawnie wyeksportowaćmyFunction w? Czy można eksportowaćstd::vector<B> i rozdzielacz B?

Jakie są implikacje zwracania wartości std :: vector według wartości? Zakładając plik wykonywalny klienta skompilowany z innym kompilatorem (-version). Czy problem powtarza się, gdy zwracana jest wartość-wartość, gdy wektor jest kopiowany? Chyba tak. Podobnie do przekazywania std :: vector jako stałej referencji: może uzyskać dostęp dostd::vector<B> (co mogło być skonstruowane przez plik wykonywalny skompilowany z innym kompilatorem (-version)) prowadzi do kłopotów wewnątrzmyFunction? Chyba znowu tak ..

Czy ostatni punkt wymieniony powyżej naprawdę jest jedynym czystym rozwiązaniem?

Z góry dziękuję za Waszą opinię.

questionAnswers(2)

yourAnswerToTheQuestion