Cara mengekspor Instansiasi kelas standar perpustakaan Template (STL) dan kelas yang berisi anggota data yang objek STL

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 168958 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini membahas cara untuk melakukan tugas berikut:
  • Ekspor Instansiasi perpustakaan Template standar Kelas (STL).
  • Ekspor kelas yang berisi anggota data yang STL objek.
Catatan bahwa Anda tidak dapat mengekspor template umum. The template harus instantiated; itu adalah, semua parameter template harus disediakan dan harus benar-benar didefinisikan jenis at the point of Instansiasi. Untuk contoh "tumpukan<int>;" instantiates STL tumpukan kelas. The Instansiasi memaksa semua anggota kelas tumpukan<int> untuk menjadi dihasilkan.</int> </int>

Juga mencatat bahwa beberapa STL kontainer (peta, set, antrian, daftar, deque) tidak dapat diekspor. Silakan merujuk ke bagian informasi lebih lanjut untuk Ikuti untuk penjelasan rinci.

INFORMASI LEBIH LANJUT

Dimulai dengan Visual C++ 5.0, mungkin untuk memaksa Instansiasi kelas template dan ekspor Instansiasi. Untuk mengekspor template kelas Instansiasi, gunakan sintaks berikut:

Untuk mengekspor STL kelas

  1. Dalam kedua DLL dan berkas .exe, menghubungkan dengan sama DLL Versi c menjalankan waktu. Baik link baik dengan Msvcrt.lib (rilis membangun) atau link kedua dengan Msvcrtd.lib (debug membangun).
  2. DLL, memberikan specifier __declspec di template Instansiasi Deklarasi untuk mengekspor STL kelas Instansiasi dari DLL.
  3. Dalam berkas .exe, menyediakan intra dan __declspec penentu dalam Deklarasi Instansiasi template untuk mengimpor kelas dari DLL. Hal ini mengakibatkan peringatan C4231 "ekstensi tidak standar yang digunakan: 'intra' sebelum template eksplisit Instansiasi." Anda dapat mengabaikan peringatan ini.

Untuk mengekspor sebuah kelas berisi anggota Data yang objek STL

  1. Dalam kedua DLL dan berkas .exe, menghubungkan dengan sama DLL Versi c menjalankan waktu. Baik link baik dengan Msvcrt.lib (rilis membangun) atau link kedua dengan Msvcrtd.lib (debug membangun).
  2. DLL, memberikan specifier __declspec di template Instansiasi Deklarasi untuk mengekspor STL kelas Instansiasi dari DLL.

    CATATAN: Anda tidak dapat melewatkan langkah 2. Anda harus mengekspor Instansiasi dari STL kelas yang Anda gunakan untuk membuat data anggota.
  3. DLL, memberikan specifier __declspec di Deklarasi kelas untuk mengekspor kelas dari DLL.
  4. Dalam berkas .exe, menyediakan specifier __declspec di Deklarasi kelas untuk mengimpor kelas dari DLL.

    Jika kelas Anda mengekspor memiliki satu atau lebih kelas dasar, maka Anda harus ekspor kelas dasar juga. Jika kelas Anda mengekspor berisi anggota data yang adalah jenis kelas, maka Anda harus mengekspor kelas anggota data sebagai baik.
CATATAN: Beberapa kelas STL menggunakan kelas-kelas STL lain. Kelas-kelas ini yang lain harus juga dapat diekspor. Kelas yang harus diekspor tercantum dalam kompilator peringatan jika Anda mengkompilasi dengan peringatan tingkat lebih rendah dari 1; yaitu, /W2, /W3, atau /W4. Peringatan tingkat 4 menghasilkan banyak pesan peringatan untuk STL header dan tidak saat ini dianjurkan untuk alasan itu.

Beberapa kelas STL berisi bersarang kelas. Kelas-kelas ini tidak dapat diekspor. Sebagai contoh, deque berisi bersarang kelas deque::iterator. Jika Anda ekspor deque, Anda akan mendapatkan peringatan bahwa Anda harus mengekspor deque::iterator. Jika Anda ekspor deque::iterator, Anda mendapatkan peringatan bahwa Anda harus mengekspor deque. Hal ini disebabkan oleh dirancang batasan bahwa setelah kelas template instantiated, tidak dapat Re-instantiated dan diekspor. Hanya STL kontainer yang saat ini dapat diekspor adalah vektor. Wadah lain (yaitu, peta, set, antrian, daftar, deque) semua berisi bersarang kelas dan tidak dapat diekspor.

Ketika Anda ekspor STL kontainer parameterized dengan jenis ditetapkan pengguna (UDT), Anda harus mendefinisikan operator < and="=" for="" your="" udt.="" for="" example,="" if="" you="" export=""> </> <myclass>, Anda harus menentukan 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>

Ketika _DLL simbol didefinisikan selama kompilasi (simbol ini secara implisit didefinisikan ketika menyusun dengan /MD atau /MDd untuk menghubungkan dengan versi DLL C Runtime), berikut STL kelas, dan berbagai operator global dan fungsi yang beroperasi di ini kelas, sudah diekspor oleh C Runtime DLL. Oleh karena itu, Anda tidak dapat mengekspor mereka dari Anda DLL. Ini seharusnya tidak menimbulkan masalah bagi executable program yang impor kelas Anda selama ini juga menggunakan versi DLL C menjalankan waktu:
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)
				
Untuk rincian spesifik pada template yang parameter yang digunakan dan fungsi-fungsi global dan operator yang menyatakan, silakan lihat yang relevan header file.

Contoh kode

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

REFERENSI

Untuk informasi tambahan, mencari topik berikut dalam Visual C++ bantuan:
Instansiasi eksplisit
__declspec
tumpukan
/ MD, ML, /MT, /LD (penggunaan Run-Time perpustakaan)

Properti

ID Artikel: 168958 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Kata kunci: 
kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:168958

Berikan Masukan

 

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