IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Probleme de dllexport avec template et stl


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut Probleme de dllexport avec template et stl
    Bonjour,

    Je bosse actuellement sur une DLL qui gère des objets. En fait au départ c'était une simple application, mais comme je risque de me reservir de pas mal de choses de ce code, j'ai voulu transformer une partie du code en DLL.

    Dans mon programme, j'ai donc un template pour manager les objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <list>
     
    template <typename T> class Manager
    {
    public:
    	static T *Load( const char *path );
    	static T *Get( const char *name );
    	static bool Delete( const char *name );
    	static void DeleteAll( void );
    protected:
    	static std::list<T*> items;
    	static T* instanciate( const char *name );
    	static bool checkValidity( T *item );
    	static const char *getItemName( T *item );
    	Manager() {}
    	virtual ~Manager() {}
    };
    Ensuite j'ai différents types d'objet, qui héritent tous d'une classe ManagedObject (que je ne détaille pas ici, car la classe de base de sert qu'à initialiser des attributs communs à tous les objets et faire quelques tests de validités) sont tous déclarés comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class SampleObject;
    typedef Manager<SampleObject> SampleObjectManager;
     
    class SampleObject : public ManagedObject
    {
    	friend class Manager<SampleObject>;
    public:
    [...]
    protected:
    	SampleObject();
    	SampleObject( const char *path, FILE *outputerr = stderr );
    	virtual ~Sprite();
    };
    J'ai donc rajouté des __declspec(dllexport) pour ManagedObject et tous mes objets. Rien à signaler. Par contre j'ai besoin d'exporter aussi les Manager de chaque classe d'objet, et la je sais pas trop comment faire... Mes spécialisations de manager sont déclarés comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Manager<SampleObject> SampleObjectManager;
    Mes managers sont tous des classes statiques. Mais comme ils utilisent une liste STL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static std::list<T*> items;
    si j'ajoute un __declspec(dllexport) à la classe template Manager, j'obtiens ce warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning C4251: 'Manager<T>::items' : class 'std::list<T*>' needs to have dll-interface to be used by clients of class 'Manager<T>'
    D'après ce que j'ai trouvé par google, c'est un problème de la STL. J'aimerais trouver une solution propre pour virer ces warnings (c'est-à-dire autre chose que des #pragma disable warning). Les applis qui utilisent ma DLL ne seront pas sensé spécialiser la classe Manager, mais seulement utiliser les managers spécifiques de chaque type d'objets (par exemple, SampleObjectManager::Load( "object.txt" )), donc dans l'absolu j'ai besoin d'exporter que les classes spécialisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Manager<SampleObject> __declspec(dllexport) SampleObjectManager
    Mais si j'exporte pas la classe template Manager, j'ai des erreurs de link dans mon appli qui utilise la dll...

    Des idées ?

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    J'ai pas tout lu mais je parie que c'est encore ce bon vieux problème d'exportation de classe template. La solution n'est pas évidente, mais elle est donnée par Microsoft ici.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Oui effectivement, excepté que j'aurais aimé ne pas avoir à linker des classes STL dans ma lib.

    J'ai trouvé une solution acceptable finalement (je la détaille pas parce qu'elle est très spécifique à mon code et ne sera utile à personne), sans exporter la classe list, donc c'est parfait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Velocity] Probleme de path avec template
    Par bousnguar dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 15/09/2008, 12h21
  2. Probleme avec parcours de stl::vector
    Par MDiabolo dans le forum SL & STL
    Réponses: 10
    Dernier message: 08/03/2006, 00h35
  3. [Kylix] Probleme de séparateur avec Kylix2 ?
    Par jeanphy dans le forum EDI
    Réponses: 4
    Dernier message: 10/02/2003, 16h41
  4. Réponses: 12
    Dernier message: 23/10/2002, 11h56
  5. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo