Comment faire pour exporter une instanciation d'une classe STL (Standard Template Library) et une classe qui contient un membre de données est un objet STL

Traductions disponibles Traductions disponibles
Numéro d'article: 168958 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article explique comment exécuter les tâches suivantes :
  • Exporter une instanciation d'une bibliothèque de modèles standard (STL) classe.
  • Exporter une classe qui contient une donnée membre qui est un STL objet.
Notez que vous ne pouvez pas exporter un modèle généralisé. Le modèle doit être instancié ; autrement dit, tous les paramètres de modèle doivent être fournie et doivent être des types complètement définis au moment de l'instanciation. Pour instance "pile <int>;" instancie la classe de pile STL. L'instanciation force tous les membres de classe de pile <int>à générer.

Notez également que certains conteneurs STL (mappage, ensemble, file d'attente, liste, deque) ne peut pas être exportés. Reportez-vous à la section informations supplémentaires à suivre pour obtenir une explication détaillée.

Plus d'informations

À partir de Visual C++ 5.0, il est possible de forcer une instanciation d'une classe de modèle et d'exporter l'instanciation. Pour exporter une instanciation de classe de modèle, utilisez la syntaxe suivante :

Pour exporter une classe STL

  1. Dans la DLL et le fichier .exe, lier avec la même DLL version du runtime du C. Lier avec MSVCRT.lib (version Release) soit lier les deux avec Msvcrtd.lib (version débogage).
  2. Dans la DLL, fournissez le spécificateur __declspec dans la déclaration de l'instanciation de modèle pour exporter l'instanciation de classe STL à partir de la DLL.
  3. Dans le fichier .exe, fournissez les spécificateurs extern et __declspec dans la déclaration de l'instanciation de modèle afin d'importer la classe à partir de la DLL. Cela génère un avertissement C4231 "extension non standard utilisée: 'extern' devant l'instanciation explicite d'un modèle." Vous pouvez ignorer cet avertissement.

Pour exporter une classe contenant un membre de données est un objet STL

  1. Dans la DLL et le fichier .exe, lier avec la même DLL version du runtime du C. Lier avec MSVCRT.lib (version Release) soit lier les deux avec Msvcrtd.lib (version débogage).
  2. Dans la DLL, fournissez le spécificateur __declspec dans la déclaration de l'instanciation de modèle pour exporter l'instanciation de classe STL à partir de la DLL.

    Remarque : Vous ne pouvez pas ignorer l'étape 2. Vous devez exporter l'instanciation de la classe STL qui vous permet de créer le membre de données.
  3. Dans la DLL, fournissez le spécificateur __declspec dans la déclaration de la classe pour exporter la classe à partir de la DLL.
  4. Dans le fichier .exe, fournissez le spécificateur __declspec dans la déclaration de la classe pour importer la classe à partir de la DLL.

    Si la classe que vous exportez a une ou plusieurs classes de base, alors vous devez exporter les classes de base. Si la classe que vous exportez contient des données membres qui sont de type classe, vous devez exporter les classes des données membres.
Remarque : Certaines classes STL utilisent autres classes STL. Ces autres branches doivent également être exportées. Les classes qui doivent être exportées sont répertoriés dans les avertissements du compilateur si vous compilez avec un niveau d'avertissement inférieur à 1; qui est, /W2, /W3 ou/W4. Niveau d'avertissement 4 génère un grand nombre de messages d'avertissement pour les en-têtes STL et n'est pas actuellement recommandée pour cette raison.

Certaines classes STL contiennent des classes imbriquées. Ces classes ne peuvent pas être exportés. Par exemple, deque contient une classe imbriquée deque::iterator. Si vous exportez deque, vous obtiendrez un avertissement que vous devez exporter deque::iterator. Si vous exportez deque::iterator, vous obtenez un avertissement que vous devez exporter deque. Cela est dû à une limitation conçue qu'une fois qu'une classe de modèle est instanciée, il ne peut pas être re-instantiated et exporté. Du seul conteneur STL actuellement peut être exporté est vecteur. Les autres conteneurs (c'est-à-dire, mappage, ensemble, file d'attente, liste, deque) contiennent toutes les classes imbriquées et ne peut pas être exportés.

Lorsque vous exportez un conteneur STL paramétré avec un type défini par l'utilisateur (UDT), vous devez définir les opérateurs < et == pour votre UDT. <myclass>Par exemple, si vous exportez vecteur < MyClass >, vous devez définir MyClass::operator < et MyClass opérateur ==. Ceci est dû au fait que toutes les classes de conteneur STL ont des opérateurs de comparaison de membre qui requièrent l'existence des opérateurs < et == pour le type de contenu. Normalement, ils ne sont pas instanciés, car ils ne sont pas utilisées. Lorsque vous instanciez une instance d'une classe de modèle, toutes les fonctions membres sont générées. Car les classes de conteneur STL ont des fonctions membres qui utilisent les opérateurs < et == pour le type de contenu, vous devez implémenter les. Si comparaison d'objets de votre UDT n'a pas de sens, vous pouvez définir les opérateurs de comparaison à retourner simplement «true».

Lorsque le _DLL de symbole est défini pendant la compilation (ce symbole est défini implicitement lors de la compilation avec /MD ou /MDd pour établir une liaison avec la version DLL du C Runtime), les classes suivantes de la STL et différents globales opérateurs et fonctions qui agissent sur ces classes, sont déjà exportés par la DLL Runtime C. Par conséquent, vous ne pouvez pas les exporter à partir de votre DLL. Cela ne doit pas provoquer de problème pour le programme exécutable qui importe votre classe dans la mesure où il utilise également la version DLL du runtime du 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)
				
pour des détails spécifiques sur lesquels les paramètres de modèle sont utilisés et les fonctions globales et les opérateurs sont déclarés, veuillez consultez le fichier d'en-tête approprié.

Exemple de code

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

Références

Pour plus d'informations, effectuez une recherche sur les rubriques suivantes dans l'aide de Visual C++ :
Instanciation explicite
__declspec
pile
/ MD, / ML, / MT, /ld (utiliser la bibliothèque Runtime)

Propriétés

Numéro d'article: 168958 - Dernière mise à jour: mardi 6 septembre 2005 - Version: 3.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Mots-clés : 
kbmt kbstl kbinfo kbcode kbhowto KB168958 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 168958
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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