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 :
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
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() {} };
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
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(); };
Mes managers sont tous des classes statiques. Mais comme ils utilisent une liste STL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef Manager<SampleObject> SampleObjectManager;
si j'ajoute un __declspec(dllexport) à la classe template Manager, j'obtiens ce warning :
Code : Sélectionner tout - Visualiser dans une fenêtre à part static std::list<T*> items;
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 warning C4251: 'Manager<T>::items' : class 'std::list<T*>' needs to have dll-interface to be used by clients of class 'Manager<T>'
Mais si j'exporte pas la classe template Manager, j'ai des erreurs de link dans mon appli qui utilise la dll...
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef Manager<SampleObject> __declspec(dllexport) SampleObjectManager
Des idées ?
Partager