كيفية تصدير يتضمن إنشاء مثيل من فئة مكتبة قالب قياسي (STL) و فئة التي تحتوي على عضو بيانات عبارة عن كائن STL

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية168958
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الموجز
تتناول هذه المقالة كيفية إجراء المهام التالية:
  • تصدير يتضمن إنشاء مثيل من "مكتبة قالب القياسية" فئة (STL).
  • تصدير فئة التي تحتوي على عضو بيانات هو STL الكائن.
لاحظ أنه قد لا تصدير قالب معمم. يجب أن يتم إنشاء مثيل القالب; أي، كافة معلمات القالب يجب أن يتم توفير كما يجب أن تكون أنواع معرّفة بشكل كامل في بذلك نقطة من إنشاء المثيل الذي. للحصول على مثيل "المكدس <int>;" instantiates فئة مكدس STL. يفرض إنشاء مثيل كافة أعضاء الفئة مكدس <int>إنشاء.

لاحظ أيضًا أنه يتعذر تصدير بعض حاويات STL (مخطط أو مجموعة ، قائمة الانتظار, قائمة أو deque). الرجاء الرجوع إلى قسم "مزيد من المعلومات" لمتابعة للحصول على شرح مفصل.
معلومات أخرى
تبدأ بـ 5.0 Visual C++ ، فمن الممكن فرض يتضمن إنشاء مثيل فئة القالب وتصدير في إنشاء المثيل. لتصدير يتضمن إنشاء مثيل فئة قالب استخدم بناء الجملة التالي:

إلى تصدير فئة STL

  1. في كل من DLL و ملف .exe ، الارتباط مع DLL نفس إصدار C وقت التشغيل. إما ارتباط كليهما مع Msvcrt.lib (إصدار البنية) أو ربط كل مع Msvcrtd.lib (تصحيح أخطاء بناء).
  2. في مكتبة الارتباط الحيوي (DLL) ، توفر محدد __declspec في تعريف إنشاء المثيل قالب لتصدير إنشاء مثيل فئة STL من DLL.
  3. في الملف .exe توفر محددات extern و __declspec في تعريف إنشاء المثيل قالب لاستيراد الفئة من DLL. ينتج عن هذا تحذير C4231 "ملحق غير قياسي يستخدم: 'extern' قبل إنشاء مثيل صريح القالب." يمكنك تجاهل هذا التحذير.

إلى تصدير فئة المتضمن عضو بيانات هو أحد كائنات STL

  1. في كل من DLL و ملف .exe ، الارتباط مع DLL نفس إصدار C وقت التشغيل. إما ارتباط كليهما مع Msvcrt.lib (إصدار البنية) أو ربط كل مع Msvcrtd.lib (تصحيح أخطاء بناء).
  2. في مكتبة الارتباط الحيوي (DLL) ، توفر محدد __declspec في تعريف إنشاء المثيل قالب لتصدير إنشاء مثيل فئة STL من DLL.

    ملاحظة: لا يمكنك تخطي الخطوة 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) و لا يمكن تصدير.

عند تصدير حاوية STL تعيين معلمات للمجموعة بواسطة نوع معرف من قبل المستخدم (UDT) ، يجب عليك تعريف عوامل التشغيل < و == UDT الخاصة بك. <myclass>على سبيل المثال، في حالة تصدير متجه < MyClass > يجب تعريف MyClass::operator < و MyClass عامل التشغيل ==. وسبب ذلك أن كافة فئات STL على حاوية عوامل تشغيل المقارنة عضو التي تتطلب وجود عوامل التشغيل < و == لنوع المضمنة. عادةً، يتم عدم إنشاء هذه بسبب عدم استخدامها. عند إنشاء مثيل فئة القالب "، يتم إنشاء كافة وظائف العضو. بسبب وجود فئات STL حاوية الوظائف الأعضاء التي تستخدم عوامل التشغيل < و == لنوع المضمنة يجب تطبيق عليها. إذا قام مقارنة الكائنات UDT الخاصة بك لا يجعل ملائماً يمكنك تحديد عوامل تشغيل المقارنة للعودة ببساطة "true".

عند تعريف _DLL رمز أثناء ترجمة (هذا هو ضمنيًا تعريف الرمز عند التحويل البرمجي مع /MD أو /MDd الارتباط مع إصدار DLL وقت التشغيل C) ، فئات STL التالية و المتنوعة عوامل العمومية والوظائف التي تعمل على هذه الفئات يتم تصدير بالفعل من قبل DLL Runtime C. لذلك، لا يمكنك تصدير هذه من DLL الخاص بك. لا يجب أن يؤدي وجود مشكلة في البرنامج القابل للتنفيذ يستورد الفئة طالما أن يستخدم أيضاً إصدار DLL C وقت التشغيل:
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
مكدس الذاكرة المؤقتة
/ /LD MD, ML ، /MT (استخدام مكتبة وقت التشغيل)

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 168958 - آخر مراجعة: 12/04/2015 17:05:06 - المراجعة: 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 KbMtar
تعليقات