Jak exportovat vytváření instance třídy knihovna standardní šablona (STL) a třída obsahující datový člen je objekt STL

Překlady článku Překlady článku
ID článku: 168958 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek popisuje, jak provádět následující úkoly:
  • Exportovat vytváření instance standardní šablona knihovny třídy (STL).
  • Třída obsahující datový člen, který je STL exportovat objekt.
Všimněte si, že pravděpodobně není exportovat všeobecný šablony. Musí být vytvořena šablona; tj všech parametrů šablony musí být dodáno a musí být zcela definované typy v okamžiku vytvoření instance. Instance "zásobníku <int>;" vytvoří instanci třídy zásobníku STL. Vytváření instance vynutí všechny členy třídy zásobníku <int>být generován.

Všimněte si také, že některé kontejnery STL (mapy, sada, fronty, seznam, deque) nelze exportovat. Naleznete v části Další informace postupujte podrobné vysvětlení.

Další informace

Počínaje Visual C++ 5.0 je možné vynutit vytváření instance šablony třídy a vytváření instance exportu. Exportovat vytváření instance šablony třídy, použijte následující syntaxi:

Export třídy STL

  1. V DLL a soubor EXE, propojit s DLL stejné verze doba spuštění C. Propojit i s Msvcrt.lib (vydání sestavení) nebo propojit i s Msvcrtd.lib (sestavení ladění).
  2. V DLL poskytují specifikátor __declspec v deklaraci vytváření instance šablony exportovat z DLL vytváření instance třídy STL.
  3. V souboru EXE poskytují specifikátory externí a __declspec v deklaraci vytváření instance šablony import třídy z DLL. Výsledkem upozornění C4231 "používá nestandardní rozšíření: 'externí' před explicitní vytváření instance šablony." Toto upozornění můžete ignorovat.

Export třída obsahující data členů, které je objekt STL

  1. V DLL a soubor EXE, propojit s DLL stejné verze doba spuštění C. Propojit i s Msvcrt.lib (vydání sestavení) nebo propojit i s Msvcrtd.lib (sestavení ladění).
  2. V DLL poskytují specifikátor __declspec v deklaraci vytváření instance šablony exportovat z DLL vytváření instance třídy STL.

    Poznámka: Nelze přeskočit krok 2. Vytváření instance třídy STL, použít k vytvoření datový člen musí exportovat.
  3. V DLL poskytují specifikátor __declspec v deklaraci třídy exportovat třídy z DLL.
  4. V souboru EXE poskytují specifikátor __declspec v deklaraci třídy import třídy z DLL.

    Pokud exportujete třídy má základní třídy potom nutné exportovat také základní třídy. Pokud exportujete třída obsahuje datové členy, které jsou typu třídy, je nutné exportovat třídy i datové členy.
Poznámka: Některé třídy STL pomocí jiných tříd STL. Tyto třídy musí také být exportovány. Třídy musí být exportovány jsou uvedeny v kompilátoru upozornění, pokud kompilace s nižší než 1; že je úroveň pro upozornění, /W2, /W3 nebo /W4. Úroveň upozornění 4 generuje mnoho zpráv upozornění pro STL záhlaví a aktuálně není proto doporučeno.

Některé třídy STL obsahují vnořené třídy. Tyto třídy lze nebudou exportovány. Pro instanci deque obsahuje vnořené třídy deque::iterator. Exportovat deque obdržíte upozornění, je nutné exportovat deque::iterator. Exportovat deque::iterator obdržíte upozornění, je nutné exportovat deque. To je způsobeno navržených omezení, jakmile instance třídy šablony může není být re-instantiated a exportovány. Vektor je pouze STL kontejner, který aktuálně být exportovány. Kontejnery (, mapy, sada, fronty, seznam, deque) obsahují všechny vnořené třídy a nelze exportovat.

Při exportu kontejner STL opatřena uživatelem definovaný typ (UDT) musíte definovat operátory < a == vaše UDT. <myclass>Například pokud exportovat vektor < Moje_třída > musíte definovat MyClass::operator < a Moje_třída operátor ==. Toto je, protože všechny třídy STL kontejneru mají operátory porovnání člen vyžadovat existenci operátory < a == typ obsažených. Vytvořit normálně, tyto není instanci, protože nejsou používány. Při vytvoření instance instanci šablony třídy jsou generovány všechny funkce členů. Protože STL kontejneru třídy mít funkce členů použít operátory < a == pro typ obsažených musí implementovat jejich. Porovnání objektů vaše UDT nedává smysl, můžete definovat operátory porovnání jednoduše vrátit "true".

Při definování _DLL symbol během kompilace (Tento symbol je implicitně definováno při kompilaci s /MD nebo /MDd propojení verze DLL C Runtime), následující třídy STL a různých globální operátorů a funkcí, které pracují na tyto třídy již exportovány podle C Runtime DLL. Proto nelze exportovat je z vaší DLL. Neměl způsobit problém spustitelný program importuje vaší třídy jako používá také verze DLL C doba spuštění:
Header      STL template class
------------------------------
<IOSFWD>    basic_ios
<IOSFWD>    <IOSFWD>
<IOSFWD>    basic_istream
<IOSFWD>    basic_string (also typedef'd as string and wstring)
<IOSFWD>    complex
<LOCALE>    messages
<XLOCALE>   codecvt
<XLOCALE>   ctype
<XLOCMON>   moneypunct
<XLOCMON>   money_get
<XLOCMON>   money_put
<XLOCNUM>   numpunct
<XLOCTIME>  time_get
<XLOCTIME>  time_put
<XSTRING>   basic_string (also typedef'd as string and wstring)
				
konkrétní podrobnosti o parametrů šablony, které jsou používány a operátory a globální funkce jsou deklarovány, prosím najdete soubor příslušné záhlaví.

Ukázkový kód

   // -------------------------------------------
   // MYHEADER.H
   //disable warnings on 255 char debug symbols
    #pragma warning (disable : 4786)
   //disable warnings on extern before template instantiation
    #pragma warning (disable : 4231)

    #include <vector>

    // Provide the storage class specifier (extern for an .exe file, null
    // for DLL) and the __declspec specifier (dllimport for .an .exe file,
    // dllexport for DLL).
    // You must define EXP_STL when compiling the DLL.
    // You can now use this header file in both the .exe file and DLL - a
    // much safer means of using common declarations than two different
    // header files.
    #ifdef EXP_STL
    #    define DECLSPECIFIER __declspec(dllexport)
    #    define EXPIMP_TEMPLATE
    #else
    #    define DECLSPECIFIER __declspec(dllimport)
    #    define EXPIMP_TEMPLATE extern
    #endif

    // Instantiate classes vector<int> and vector<char>
    // This does not create an object. It only forces the generation of all
    // of the members of classes vector<int> and vector<char>. It exports
    // them from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<int>;
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<char>;

    // Declare/Define a class that contains both a static and non-static
    // data member of an STL object.
    // Note that the two template instantiations above are required for
    // the data members to be accessible. If the instantiations above are
    // omitted, you may experience an access violation.
    // Note that since you are exporting a vector of MyClass, you must
    // provide implementations for the operator < and the operator ==.
    class DECLSPECIFIER MyClass
    {
    public:
        std::vector<int> VectorOfInts;
        static std::vector<char> StaticVectorOfChars;

    public:
        bool operator < (const MyClass > c) const
        {
            return VectorOfInts < c. VectorOfInts;
        }
        bool operator == (const MyClass > c) const
        {
            return VectorOfInts == c. VectorOfInts;
        }
    };

    // Instantiate the class vector<MyClass>
    // This does not create an object. It only forces the generation of
    // all of the members of the class vector<MyClass>. It exports them
    // from the DLL and imports them into the .exe file.
    EXPIMP_TEMPLATE template class DECLSPECIFIER std::vector<MyClass>;

    // -------------------------------------------
    // Compile options needed: /GX /LDd /MDd /D"EXP_STL"
    //                     or: /GX /LD  /MD  /D"EXP_STL"
    // DLL.CPP

    #include "MyHeader.h"
    std::vector<char> MyClass::StaticVectorOfChars;

    // -------------------------------------------
    // Compile options needed: /GX /MDd
    //                     or: /GX /MD
    // EXE.CPP

    #include <iostream>
    #include "MyHeader.h"

    int main ()
    {
        MyClass x;

        for (int i=0; i<5; i++) x.VectorOfInts.push_back(i);
        for (char j=0; j<5; j++) x.StaticVectorOfChars.push_back('a' + j);

        std::vector<int>::iterator vii = x.VectorOfInts.begin();
        while (vii != x.VectorOfInts.end())
        {
            std::cout << *vii;
            std::cout << " displayed from x.VectorOfInts" << std::endl;
            vii++;
        }
        std::vector<char>::iterator vci = x.StaticVectorOfChars.begin();
        while (vci != x.StaticVectorOfChars.end())
        {
            std::cout << *vci;
            std::cout << " displayed from MyClass::StaticVectorOfChars";
            std::cout << std::endl;
            vci++;
        }

        std::vector<MyClass> vy;
        for (i=0; i=5; i++) vy.push_back(MyClass());

        return 1;
    }
				

Odkazy

Další informace vyhledejte na následující témata v nápovědě pro Visual C++:
Explicitní vytváření instance
__declspec
Zásobník
/ /LD (použití-prováděcí knihovna) MD, ML, /MT

Vlastnosti

ID článku: 168958 - Poslední aktualizace: 6. září 2005 - Revize: 3.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Klíčová slova: 
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:168958

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com