Με τον τρόπο εξαγωγής ενός δημιουργίας μιας κλάσης τυπική βιβλιοθήκη προτύπων (STL) και μια κλάση που περιέχει ένα μέλος δεδομένων που είναι αντικείμενο STL

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 168958 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Αυτό το άρθρο περιγράφει τον τρόπο εκτέλεσης των παρακάτω εργασιών:
  • Εξαγωγή μιας δημιουργίας από μια τυπική βιβλιοθήκη προτύπων κλάσης (STL).
  • Εξαγωγή μιας κλάσης που περιέχει ένα μέλος δεδομένων που είναι STL ένα αντικείμενο.
Σημειώστε ότι δεν μπορεί να εξαγάγετε γενική πρότυπο. Το πρότυπο πρέπει να δημιουργείται παρουσία, δηλαδή, όλες τις παραμέτρους του προτύπου πρέπει να δοθεί και πρέπει να είναι πλήρως καθορισμένους τύπους στο σημείο της δημιουργίας. Για την παρουσία "στοίβας <int>;" εμφανίζει την κλάση στοίβας STL. Η δημιουργία Εξαναγκάζει όλα τα μέλη της κλάσης στοίβας <int>να δημιουργούνται.</int></int>

Σημειώστε επίσης ότι δεν μπορούν να εξαχθούν ορισμένα κοντέινερ STL (map, σύνολο, ουρά, λίστα, deque). Ανατρέξτε στην ενότητα "περισσότερες πληροφορίες" για να ακολουθήσετε για μια αναλυτική επεξήγηση.

Περισσότερες πληροφορίες

Ξεκινώντας με το Visual C++ 5.0, είναι δυνατό να επιβάλλουν μια δημιουργίας μιας κλάσης πρότυπο και εξαγωγή της δημιουργίας. Για να εξαγάγετε ένα πρότυπο δημιουργίας κλάσης, χρησιμοποιήστε την παρακάτω σύνταξη:

Για να εξαγάγετε μια κλάση STL

  1. Και το DLL και το αρχείο .exe, η σύνδεση με το ίδιο αρχείο DLL έκδοση από το χρόνο εκτέλεσης C. Είτε συνδέσετε δύο με Msvcrt.lib (έκδοση build) ή να συνδέσετε και τα δύο με Msvcrtd.lib (build εντοπισμού σφαλμάτων).
  2. Στο αρχείο DLL, παρέχουν το προσδιοριστικό __declspec στη δήλωση δημιουργίας προτύπου για να εξαγάγετε τη δημιουργία κλάσης STL από το αρχείο DLL.
  3. Στο αρχείο .exe, παρέχουν το τις προσδιοριστικά extern και __declspec στη δήλωση δημιουργίας προτύπου για την εισαγωγή της κλάσης από το αρχείο DLL. Το αποτέλεσμα είναι μια προειδοποίηση C4231 "μη τυπική επέκταση χρησιμοποιείται: 'extern' πριν από τη ρητή Δημιουργία προτύπου." Μπορείτε να αγνοήσετε αυτήν την προειδοποίηση.

Για να εξαγάγετε μια κλάση που περιέχει ένα μέλος δεδομένων που είναι ένα αντικείμενο STL

  1. Και το DLL και το αρχείο .exe, η σύνδεση με το ίδιο αρχείο DLL έκδοση από το χρόνο εκτέλεσης C. Είτε συνδέσετε δύο με Msvcrt.lib (έκδοση build) ή να συνδέσετε και τα δύο με Msvcrtd.lib (build εντοπισμού σφαλμάτων).
  2. Στο αρχείο DLL, παρέχουν το προσδιοριστικό __declspec στη δήλωση δημιουργίας προτύπου για να εξαγάγετε τη δημιουργία κλάσης STL από το αρχείο DLL.

    ΣΗΜΕΙΩΣΗ:Δεν μπορείτε να παραλείψετε το βήμα 2. Πρέπει να εξαγάγετε τη δημιουργία της κλάσης STL που χρησιμοποιείτε για να δημιουργήσετε το μέλος δεδομένων.
  3. Στο αρχείο DLL, παρέχουν το προσδιοριστικό __declspec στη δήλωση της κλάσης για την εξαγωγή της κλάσης από το αρχείο DLL.
  4. Στο αρχείο .exe, παρέχουν το προσδιοριστικό __declspec στη δήλωση της κλάσης για την εισαγωγή της κλάσης από το αρχείο DLL.

    Εάν η κλάση που θέλετε να εξαγάγετε έχει μία ή περισσότερες βασικές κλάσεις και, στη συνέχεια, πρέπει να εξαγάγετε επίσης τις βασικές κλάσεις. Εάν η κλάση που θέλετε να εξαγάγετε περιέχει μέλη δεδομένων που είναι του τύπου κλάσης, πρέπει να εξαγάγετε τις κλάσεις μέλη δεδομένων.
ΣΗΜΕΙΩΣΗ:Ορισμένες κλάσεις STL χρησιμοποιούν άλλες κλάσεις STL. Επίσης πρέπει να γίνει εξαγωγή αυτών των άλλων κλάσεων. Οι κλάσεις που πρέπει να εξαχθούν αναγράφονται στο μεταγλωττιστή προειδοποιήσεις εάν μεταγλωττίσετε με ένα επίπεδο προειδοποίησης κάτω από 1; αυτό, /W2, /W3 ή /W4. Επίπεδο προειδοποίησης 4 δημιουργεί πολλά μηνύματα προειδοποίησης για κεφαλίδες STL και δεν συνιστάται αυτή τη στιγμή για αυτόν το λόγο.

Ορισμένες κλάσεις STL περιέχει ένθετους κλάσεις. These classes can not be exported. For instance, deque contains a nested class deque::iterator. If you export deque, you will get a warning that you must export deque::iterator. If you export deque::iterator, you get a warning that you must export deque. This is caused by a designed limitation that once a template class is instantiated, it can not be re-instantiated and exported. The only STL container that can currently be exported is vector. The other containers (that is, map, set, queue, list, deque) all contain nested classes and cannot be exported.

When you export an STL container parameterized with a user-defined type (UDT), you must define the operators < and="=" for="" your="" udt.="" for="" example,="" if="" you="" export=""><myclass>, you must define 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>

When the symbol _DLL is defined during compiling (this symbol is implicitly defined when compiling with /MD or /MDd to link with the DLL version of the C Runtime), the following STL classes, and various global operators and functions that operate on these classes, are already exported by the C Runtime DLL. Therefore, you cannot export them from your 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)

Ιδιότητες

Αναγν. άρθρου: 168958 - Τελευταία αναθεώρηση: Σάββατο, 18 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Λέξεις-κλειδιά: 
kbstl kbinfo kbcode kbhowto kbmt KB168958 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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