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

文章翻譯 文章翻譯
文章編號: 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 - 上次校閱: 2005年9月6日 - 版次: 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
關鍵字:?
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:168958
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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