您目前已離線,請等候您的網際網路重新連線

如何匯出的標準樣版程式庫 (STL) 類別和包含是 STL 物件的資料成員的類別執行個體化

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:168958
本文已封存。本文係以「現狀」提供且不會再更新。
結論
本文將告訴您如何執行下列工作:
  • 匯出執行個體化的標準樣板程式庫 (STL) 類別。
  • 匯出類別,其中包含的是一個 STL 資料成員物件。
請注意您可能不匯出一個廣義的範本。範本必須被具現化 ; 也就是所有範本參數必須提供和必須完全定義的型別執行個體化的點。 執行個體 」 堆疊 <int>; 「 執行個體化 STL 堆疊類別。執行個體化強制類別堆疊 <int>来產生的所有的成員。

同時也請注意有些 STL 容器 (對應、 集合、 佇列、 清單、 deque) 無法匯出。請其他資訊一節来遵循的詳細說明,參閱。
其他相關資訊
開始 Visual C++ 5.0 有可能強制的樣板類別執行個體化和匯出執行個體化。若要匯出範本類別執行個體化,使用下列語法:

若要匯出的 STL 類別

  1. 在 DLL 和.exe 檔案中連結使用相同的 DLL 的 C 執行階段版本。可能是連結兩者都具有 Msvcrt.lib (發行組建) 或連結兩者都具有 Msvcrtd.lib (偵錯組建中)。
  2. 在該 DLL 提供樣板具現化宣告 __declspec 的規範從 DLL 匯出 STL 類別執行個體化。
  3. .exe] 檔案中提供 extern 和 __declspec 規範範本執行個體化宣告中的從 DLL 匯入類別。這會導致警告 C4231"使用非標準的擴充: 'extern' 之前樣板明確執行個體化"您可以忽略此警告。

若要匯出包含是 STL 物件的資料成員的類別

  1. 在 DLL 和.exe 檔案中連結使用相同的 DLL 的 C 執行階段版本。可能是連結兩者都具有 Msvcrt.lib (發行組建) 或連結兩者都具有 Msvcrtd.lib (偵錯組建中)。
  2. 在該 DLL 提供樣板具現化宣告 __declspec 的規範從 DLL 匯出 STL 類別執行個體化。

    注意:您不能略過步驟 2。您必須匯出所要建立的資料成員使用 STL 類別的執行個體化。
  3. 在 DLL 中提供的類別宣告中 __declspec 規範從 DLL 匯出類別。
  4. .exe] 檔案中提供的類別宣告中 __declspec 規範從 DLL 匯入類別。

    如果您要匯出類別具有一或多個基底類別,那麼您必須匯出基底類別。如果您要匯出的類別中包含的類別類型的資料成員然後您必須匯出資料成員的類別。
注意:有些 STL 類別使用其他 STL 類別。這些其他類別也必須匯出。如果您使用比 1 ; 該是較低的警告層級、 /W2、 /W3 或/W4 編譯時,必須匯出的類別詳列於編譯器的警告。警告層級 4 產生大量的 STL 標頭的警告訊息,並不是目前建議基於該原因。

有些 STL 類別包含巢狀的類別。這些類別不可以匯出。比方說 deque 包含巢狀的類別 deque::iterator。如果您匯出 deque,您就會收到警告,您必須匯出 deque::iterator。如果您匯出 deque::iterator,會出現警告,您必須匯出 deque。這被因為設計的限制一旦樣板類別具現化,能不 re-instantiated 及匯出。唯一的 STL 容器目前匯出為向量。其他容器 (也就是對應、 集合、 佇列、 清單、 deque) 所有包含巢狀的類別,而且無法匯出。

當您匯出使用者定義型別 (UDT) 以參數化的 STL 容器時,您必須定義運算子 < 和 = = 對您的 UDT。<myclass>比方說如果您匯出向量 < MyClass >,您必須定義 MyClass::operator < 和 MyClass 運算子 = =。這是因為所有 STL 容器類別都有需要的運算子存在的成員比較運算子 < 和 = = 被收納的類型。通常,這些不會產生因為不使用。 當您具現化樣板類別的執行個體時,就會產生所有的成員函式。因為 STL 容器類別必須使用的運算子的成員函式 < = = 和被收納的型別必須實作它們。如果比較您的 UDT 物件,並不會讓有意義,您可以定義比較運算子只是傳回 「 真正]。

在編譯 (這個符號會隱含地定義以/MD 或 /MDd 連結 DLL 版本的 C 執行階段編譯時)、 下列的 STL 類別和各種通用的運算子和期間在這些類別作業的函式定義符號 _DLL 時,會已經匯出由 C 執行階段 DLL 中。因此,您無法從您的 DLL 匯出它們。這應該不會造成匯入您的類別,只要它也會使用 C 執行階段 DLL 版本的可執行程式的問題:
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)				
如哪一個範本參數用來和宣告的全域函式和運算子的特定詳細資訊,請參閱相關的標頭檔。

範例程式碼

   // -------------------------------------------   // 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;    }				
参考
有關其他資訊搜尋 [另下列中 Visual C++ [說明] 主題上新檔]:
明確執行個體化
__declspec
堆疊
/ MD,ML,/MT/LD (使用執行階段程式庫)

警告:本文為自動翻譯

內容

文章識別碼:168958 - 最後檢閱時間:12/04/2015 17:05:17 - 修訂: 3.0

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

  • kbnosurvey kbarchive kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtzh
意見反應