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

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
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
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)

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 168958 - Xem lại Lần cuối: 12/04/2015 17:05:17 - Bản sửa đổi: 2.0

Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition

  • kbnosurvey kbarchive kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtvi
Phản hồi