วิธีการส่งออกข้อ instantiation ของคลาสที่มาตรฐานแม่แบบของไลบรารี (STL) และคลาสที่ประกอบด้วยสมาชิกข้อมูลที่เป็นวัตถุ STL

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 168958 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความนี้อธิบายวิธีการทำงานต่อไปนี้:
  • ส่งออกข้อ instantiation ของไลบรารีแม่แบบมาตรฐานคลา (STL)
  • คลาสที่ประกอบด้วยสมาชิกข้อมูลที่เป็น STL มีการส่งออกวัตถุ
โปรดสังเกตว่า คุณอาจไม่ส่งเท็มเพล generalized แม่แบบต้องถูก instantiated นั่นคือ พารามิเตอร์แม่แบบทั้งหมดต้องป้อนค่า และต้องเป็นชนิดที่กำหนดไว้อย่างสมบูรณ์ที่ point ของ instantiation สำหรับอินสแตนซ์ "สแตก <int>;" instantiates คลาสแตก STL instantiation การบังคับให้สมาชิกทุกคนของกองซ้อนของคลา <int>ให้มีสร้างงาน</int> </int>

นอกจากนี้ โปรดสังเกตว่า บางคอนเทนเนอร์ STL (แมป ชุด คิว รายการ deque) ไม่สามารถส่งออก โปรดอ้างถึงส่วนรายละเอียดเพิ่มเติมเป็นไปตามสำหรับคำอธิบายที่ละเอียด

ข้อมูลเพิ่มเติม

ขึ้นต้น ด้วย 5.0 c ++ Visual คุณยังสามารถบังคับให้มี instantiation ของคลาสที่แม่แบบ และการส่งออกที่ instantiation การส่งออกแบบ instantiation คลาเท็มเพล ใช้ไวยากรณ์ต่อไปนี้:

เมื่อต้องการส่งออกมีคลา STL

  1. ในทั้ง DLL และแฟ้ม.exe เชื่อมโยงกับ DLL เดียวกันกับรุ่นของรันไทม์ของ C เชื่อมโยงทั้งสอง ด้วย Msvcrt.lib (การสร้างผลิต) หรือทั้งสอง ด้วย Msvcrtd.lib (ตรวจแก้จุดบกพร่องสร้าง) ที่เชื่อมโยง
  2. ใน DLL ให้ตัวระบุ __declspec ในรายงานภาษี instantiation ของต้นแบบการส่งออก instantiation ของคลา STL จาก DLL
  3. ในแฟ้ม.exe ให้ที่ extern และ __declspec specifiers ในรายงานภาษี instantiation ของต้นแบบการนำเข้าคลาจาก DLL ซึ่งผลคำเตือน C4231 "ใช้ส่วนขยายของ nonstandard: 'extern' ก่อน instantiation ที่ชัดเจนของแม่แบบ" คุณสามารถละเว้นคำเตือนนี้

เมื่อต้องการส่งออกระดับชั้นที่ประกอบด้วยสมาชิกของข้อมูลที่มีวัตถุการ STL

  1. ในทั้ง DLL และแฟ้ม.exe เชื่อมโยงกับ DLL เดียวกันกับรุ่นของรันไทม์ของ C เชื่อมโยงทั้งสอง ด้วย Msvcrt.lib (การสร้างผลิต) หรือทั้งสอง ด้วย Msvcrtd.lib (ตรวจแก้จุดบกพร่องสร้าง) ที่เชื่อมโยง
  2. ใน DLL ให้ตัวระบุ __declspec ในรายงานภาษี instantiation ของต้นแบบการส่งออก instantiation ของคลา STL จาก DLL

    หมายเหตุ::คุณไม่สามารถข้ามขั้นตอนที่ 2 คุณต้องส่งออก instantiation ของคลา 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 ซึ่งมีสาเหตุจากข้อจำกัดการออกแบบให้เมื่อ instantiated คลาสที่ต้นแบบ มันสามารถไม่ re-instantiated และส่งออก คอนเทนเนอร์ STL เท่านั้นที่อยู่ในขณะนี้คุณสามารถส่งออกเป็น vector ที่อื่นคอนเทนเนอร์ (นั่นคือ แมป ชุด คิว รายการ deque) ทั้งหมดประกอบด้วยคลาสของที่ซ้อนกัน และไม่สามารถส่งออก

เมื่อคุณส่งออกเป็นคอนเทนเนอร์ STL parameterized มีชนิดกำหนดโดยผู้ใช้ (UDT), คุณต้องกำหนดตัวดำเนินการที่ < and="=" for="" your="" udt.="" for="" example,="" if="" you="" export=""> <myclass> คุณต้องกำหนด 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="" "true."=""></> </myclass>

ส่งเมื่อมีกำหนด _DLL สัญลักษณ์ในระหว่างการคอมไพล์ (สัญลักษณ์นี้ implicitly กำหนดเมื่อคอมไพล์ ด้วย /MD หรือ /MDd การเชื่อมโยงกับ DLL รุ่นรันไทม์ของ C), คลาส STL ต่อไปนี้ หลายตัวดำเนินการสากล และฟังก์ชันที่ดำเนินการบนคลาสที่เหล่านี้ แล้วออก โดย DLL รันไทม์ของ C ดังนั้น คุณไม่สามารถส่งออกจาก DLL ของคุณ This should not cause a problem for the executable program that imports your class as long as it also uses the DLL version of the C run time:
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)
				
For specific details on which template parameters are used and which global functions and operators are declared, please see the relevant header file.

ตัวอย่างรหัส

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

ข้อมูลอ้างอิง

For additional information, search on the following topics in Visual C++ Help:
Explicit Instantiation
__declspec
stack
/MD, /ML, /MT, /LD (Use Run-Time Library)

คุณสมบัติ

หมายเลขบทความ (Article ID): 168958 - รีวิวครั้งสุดท้าย: 7 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Keywords: 
kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:168958

ให้ข้อเสนอแนะ

 

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