Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 6


|
Conversation (Résolue) : template cellule d'un arbre |
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 222
Snippets: 5
Tutoriels: 0
Site web
Hors ligne |
Coucou tout le monde. Je viens de me remettre sur mon projet ( retour des vacances )
Et j'ai un soucis avec la déclaration d'une cellule, pour mon arbre. Je vous laisse juger du problème avec le code et les erreurs correspondantes ci-dessous.
Code wxWidgets: template <typename T> class GR_TreeCellule { public: GR_TreeCellule() ; virtual ~GR_TreeCellule() {} GR_TreeCellule<T>* m_Parent ; T* m_Item ; __gnu_cxx::hash_map<int, GR_TreeCellule<T>*, wxIntegerHash, wxIntegerEqual> m_Childrens ; // erreur ici };
error: using-declaration for non-member at class scope error: expected `;' before '<' token
Code wxWidgets:template <typename T> class GR_TreeCellule ; template <typename T> WX_DECLARE_HASH_MAP( int, GR_TreeCellule<T>*, wxIntegerHash, wxIntegerEqual, HashMapIntCellule ) ; // erreur ici template <typename T> class GR_TreeCellule { public: GR_TreeCellule() ; virtual ~GR_TreeCellule() {} GR_TreeCellule<T>* m_Parent ; T* m_Item ; HashMapIntCellule<T> m_Childrens ; };
error: `HashMapIntCellule_wxImplementation_Pair' does not name a type error: `pair_type' does not name a type ... (et pleins d'autres messsages liés à cette erreur ) ---------- Je tente avec cette solution. Je vous dis après si il y a des soucis avec le fait que T et U soient liées.
Code Cpp:template <typename T, typename U > // T = typeItem , HashMapIntCellule = U class GR_TreeCellule { public: GR_TreeCellule() ; virtual ~GR_TreeCellule() {} GR_TreeCellule<T, U>* m_Parent ; T* m_Item ; U m_Childrens ; };
-----------
Juste pour indication, au final avec toute les map et iterator le template a fini par ressembler à ça ( vive les macros )
Code Cpp: // T = typeItem dériver de GR_AbstractItem // U = WX_DECLARE_HASH_MAP( int, GR_TreeCellule<T>*, wxIntegerHash, wxIntegerEqual, HashMapIntCellule ) // V = std::map< int, GR_TreeCellule<T>*> MapIntCellule // W = std::map< int, T*> MapIntItem // UCstIt = U::const_iterator // UIt = U::iterator #define TEMPLATE_TYPENAME_GR_TREE \ template <typename T, typename U, typename V, typename W, typename UCstIt, typename UIt> // je sais c'est risible, mais bon ça marche comme ça :p #define TTREE \ T, U, V, W, UCstIt, UIt TEMPLATE_TYPENAME_GR_TREE class GR_TreeCellule { public: GR_TreeCellule() ; virtual ~GR_TreeCellule() {} GR_TreeCellule<TTREE>* m_Parent ; T* m_Item ; U m_Childrens ; }; ---------- Youhou bein non Comme prévu il y a des soucis avec le fait que T et U soient liées. C'est pas encore ça, problème de portée. Ça se mort la queue lors de la définition du template.
Code wxWidgets: typedef GR_TreeCellule<GR_GLRenderable, HashMapIntCellule, MapIntCellule, MapIntItem, HashMapIntCellule::const_iterator, HashMapIntCellule::iterator> GR_GLRenderableTReeCellule ; WX_DECLARE_HASH_MAP( int, GR_GLRenderableTReeCellule*, wxIntegerHash, wxIntegerEqual, HashMapIntCellule ) ; typedef std::map< int, GR_GLRenderableTReeCellule*> MapIntCellule ; typedef std::map< int, T*> MapIntItem ; typedef GR_Tree<GR_GLRenderable, HashMapIntCellule, MapIntCellule, MapIntItem, HashMapIntCellule::const_iterator, HashMapIntCellule::iterator> GR_TreeGLRenderable ; ---------- Je pensais qu'avec le wx.h ça suffirait pour inclure ext/hash_map, mais apparament non il me fallait le réinclure (mal grès que Codeblocks m'affichait les membres de __gnu_xx) et d'utiliser les template par défaut ( cf :
Code Cpp:template<class _Key, class _Tp, class _HashFcn = hash<_Key>, class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> > )
Voila ça donne ça : Juste un problème d'include au final ... ou comment partir à pétra outch coke.
Code Cpp:#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "ext/hash_map" template <typename T> class GR_TreeCellule { public: GR_TreeCellule() ; virtual ~GR_TreeCellule() {} GR_TreeCellule<T>* m_Parent ; T* m_Item ; __gnu_cxx::hash_map< int, GR_TreeCellule<T>*> m_Childrens ; };
(Je mettrais résolu quand ça compilera on sais jamais ) ---------- d'ailleurs une petite astuce (enfin si vous voulez que ça compile ) pour déclarer des fonctions qui renvoient un template iterator (toujours dans le cadre de mon arbre)
Code Cpp: typedef typename std::map< int,GR_TreeCellule<T>*>::const_iterator const_iterator; const_iterator begin() { return m_Map.begin() ; } const_iterator end() { return m_Map.end() ; }
Dernière modification par Gandi (12-08-2008 23:08:36)
|
"Les ordinateurs ne remplaceront jamais les livres. Vous ne pouvez pas vous mettre sur une pile de disquettes pour atteindre le haut de votre armoire" ( Sam Ewing )
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Hé hé ! T'as bien mérité ton surnom de "Gourou de la secte", toi ! 
Gandi:Juste un problème d'include au final ... ou comment partir à pétra outch coke J'avais encore jamais entendu cette variante 
Bonne continuation quand même pour ton projet  @+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 222
Snippets: 5
Tutoriels: 0
Site web
Hors ligne |
Xaviou:Hé hé ! T'as bien mérité ton surnom de "Gourou de la secte", toi !  Huhu mici j'adore (la première fois je me demandais si c'étais moi qui me l'avais mis, quand j'ai vu que je pouvais pas l'editer j'ai su )
Dernière modification par Gandi (12-08-2008 23:12:54)
|
"Les ordinateurs ne remplaceront jamais les livres. Vous ne pouvez pas vous mettre sur une pile de disquettes pour atteindre le haut de votre armoire" ( Sam Ewing )
|
|