Làm th? nào đ? xu?t kh?u m?t instantiation c?a m?t thư vi?n m?u tiêu chu?n (STL) và m?t khóa có ch?a m?t thành viên d? li?u đó là m?t đ?i tư?ng STL

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 168958 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Bài vi?t này th?o lu?n v? làm th? nào đ? th?c hi?n các tác v? sau:
  • Xu?t chuy?n m?t instantiation m?t thư vi?n m?u chu?n L?p h?c (STL).
  • Xu?t kh?u m?t l?p có ch?a m?t thành viên d? li?u là m?t STL đ?i tư?ng.
Lưu ? r?ng b?n không có th? xu?t m?t m?u t?ng quát. Các m?u ph?i đư?c instantiated; có ngh?a là, t?t c? các tham s? m?u ph?i cung c?p và ph?i là hoàn toàn xác đ?nh lo?i t?i đi?m c?a instantiation. Đ?i v?i trư?ng h?p "ngăn x?p<int>;" instantiates STL ngăn x?p h?ng. Các instantiation l?c lư?ng t?t c? thành viên c?a ngăn x?p h?ng<int> ph?i đư?c t?o ra.</int></int>

C?ng lưu ? r?ng m?t s? container STL (b?n đ?, b?, x?p hàng, danh sách, deque) không th? đư?c xu?t chuy?n. Xem thêm thông tin đ? ph?n làm theo cho m?t l?i gi?i thích chi ti?t.

THÔNG TIN THÊM

B?t đ?u v?i Visual C++ 5.0, có th? ép bu?c m?t instantiation c?a m?t l?p h?c tiêu b?n và xu?t kh?u instantiation. Xu?t chuy?n m?t m?u l?p instantiation, s? d?ng cú pháp sau:

Xu?t chuy?n m?t l?p STL

  1. DLL và file exe, liên k?t v?i cùng m?t DLL Phiên b?n c ch?y th?i gian. M?t trong hai liên k?t c? hai v?i Msvcrt.lib (Phiên b?n xây d?ng) ho?c liên k?t v?i Msvcrtd.lib (g? l?i xây d?ng).
  2. Trong DLL, cung c?p specifier __declspec trong các m?u instantiation tuyên b? đ? xu?t kh?u STL instantiation l?p t? DLL.
  3. Trong file exe, cung c?p extern và __declspec specifiers trong tuyên b? instantiation m?u đ? chuy?n nh?p l?p t? DLL. Đi?u này k?t qu? trong m?t c?nh báo C4231 "chu?n m? r?ng s? d?ng: 'extern' trư?c khi m?u r? ràng instantiation." B?n có th? b? qua c?nh báo này.

Xu?t chuy?n m?t l?p có ch?a m?t thành viên d? li?u đó là m?t đ?i tư?ng STL

  1. DLL và file exe, liên k?t v?i cùng m?t DLL Phiên b?n c ch?y th?i gian. M?t trong hai liên k?t c? hai v?i Msvcrt.lib (Phiên b?n xây d?ng) ho?c liên k?t v?i Msvcrtd.lib (g? l?i xây d?ng).
  2. Trong DLL, cung c?p specifier __declspec trong các m?u instantiation tuyên b? đ? xu?t kh?u STL instantiation l?p t? DLL.

    CHÚ Ý: B?n không th? b? qua bư?c 2. B?n ph?i xu?t kh?u instantiation c?a các STL l?p mà b?n s? d?ng đ? t?o tài kho?n c?a d? li?u.
  3. Trong DLL, cung c?p specifier __declspec trong các tuyên b? c?a các l?p h?c đ? xu?t kh?u l?p t? DLL.
  4. Trong file exe, cung c?p specifier __declspec trong các tuyên b? c?a các l?p h?c đ? nh?p l?p t? DLL.

    Nếu l?p b?n đang xu?t kh?u có m?t ho?c nhi?u các l?p h?c cơ s?, sau đó b?n ph?i xu?t kh?u các căn c? các l?p h?c là t?t. N?u giai c?p b?n đang xu?t kh?u ch?a d? li?u thành viên đó là l?p ki?u, sau đó b?n ph?i xu?t kh?u các l?p h?c c?a các thành viên d? li?u như t?t.
CHÚ Ý: M?t s? l?p h?c STL s? d?ng l?p STL khác. Các l?p h?c khác ph?i c?ng đư?c xu?t kh?u. Các l?p h?c ph?i đư?c xu?t chuy?n đư?c li?t kê trong tr?nh biên d?ch c?nh báo n?u b?n biên d?ch v?i m?t c?nh báo c?p th?p hơn 1; đó là, /W2, /W3, ho?c /W4. C?nh báo c?p 4 t?o ra r?t nhi?u thông đi?p c?nh báo cho các ph?n đ?u STL và không hi?n nay nên v? l? do đó.

M?t s? l?p h?c STL ch?a các l?p l?ng nhau. Các l?p h?c có th? không đư?c xu?t kh?u. Ví d?, deque có m?t l?ng nhau l?p deque::iterator. N?u b?n xu?t deque, b?n s? nh?n đư?c m?t chú ? r?ng b?n ph?i xu?t kh?u deque::iterator. N?u b?n xu?t deque::iterator, b?n nh?n đư?c m?t c?nh báo r?ng b?n ph?i xu?t kh?u deque. Đi?u này gây ra b?i m?t thi?t k? gi?i h?n m?t r?ng khi m?t l?p m?u instantiated, nó có th? không Re-instantiated và xu?t kh?u. Các container STL duy nh?t có th? hi?n xu?t kh?u là vector. Các thùng ch?a khác (có ngh?a là, b?n đ?, b?, x?p hàng, danh sách, deque) t?t c? ch?a l?ng nhau các l?p h?c và không th? đư?c xu?t chuy?n.

Khi b?n xu?t chuy?n m?t container STL vec v?i m?t ngư?i dùng xác đ?nh lo?i (UDT), b?n ph?i xác đ?nh các nhà khai thác < and="=" for="" your="" udt.="" for="" example,="" if="" you="" export=""><myclass>, b?n ph?i xác đ?nh MyClass::operator < and="" myclass="" operator="=." this="" is="" because="" all="" stl="" container="" classes="" have="" member="" comparison="" operators="" that="" require="" the="" existence="" of="" the="" operators="">< and="=" for="" the="" contained="" type.="" normally,="" these="" are="" not="" instantiated="" because="" they="" are="" not="" used.="" when="" you="" instantiate="" an="" instance="" of="" a="" template="" class,="" all="" member="" functions="" are="" generated.="" because="" the="" stl="" container="" classes="" have="" member="" functions="" that="" use="" the="" operators="">< and="=" for="" the="" contained="" type,="" you="" must="" implement="" them.="" if="" comparing="" objects="" of="" your="" udt="" does="" not="" make="" sense,="" you="" can="" define="" the="" comparison="" operators="" to="" simply="" return=""><b00></b00></></myclass>

Khi bi?u tư?ng _DLL đư?c đ?nh ngh?a trong biên so?n (bi?u tư?ng này ng?m đ?nh khi biên d?ch v?i /MD ho?c /MDd đ? liên k?t v?i phiên b?n DLL c?a C Runtime), sau STL các l?p h?c, và các nhà đi?u hành toàn c?u và ch?c năng ho?t đ?ng trên các các l?p h?c, đ? đư?c xu?t kh?u b?ng C Runtime DLL. V? v?y, b?n có th? không xu?t chuy?n chúng t? DLL c?a b?n. Đi?u này không nên gây ra m?t v?n đ? cho t?p tin th?c thi chương tr?nh nh?p kh?u l?p h?c c?a b?n khi nó c?ng s? d?ng phiên b?n DLL c?a các C ch?y th?i gian:
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)
				
Đ? bi?t chi ti?t c? th? trên m?u mà các thông s? đư?c s? d?ng và nh?ng ch?c năng trên toàn c?u và nhà khai thác đư?c tuyên b?, xin vui l?ng xem các có liên quan t?p tin tiêu đ?.

M?u m?

   // -------------------------------------------
   // 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;
    }
				

THAM KH?O

Đ? có thêm thông tin, t?m ki?m trên các ch? đ? sau trong Visual C++ tr? giúp:
R? ràng Instantiation
__declspec
ngăn x?p
/ MD, ML, /MT, /LD (s? d?ng th?i gian ch?y thư vi?n)

Thu?c tính

ID c?a bài: 168958 - L?n xem xét sau cùng: 19 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
T? khóa: 
kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:168958

Cung cấp Phản hồi

 

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