wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» template cellule d'un arbre
Conversation (Résolue) : template cellule d'un arbre
11-08-2008 13:01:55  template cellule d'un arbre #1
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 214
Snippets: 5
Tutoriels: 0
Site web
Hors ligne
Coucou tout le monde.
Je viens de me remettre sur mon projet ( retour des vacances :p )

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 :p )

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 :p ... 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 :p )
----------
d'ailleurs une petite astuce (enfin si vous voulez que ça compile :p) 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 )
12-08-2008 23:07:25  Re: template cellule d'un arbre #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Hé hé !
T'as bien mérité ton surnom de "Gourou de la secte", toi ! :lol:

Gandi:
Juste un problème d'include au final :p ... ou comment partir à pétra outch coke
J'avais encore jamais entendu cette variante :lol:

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à...
12-08-2008 23:11:51  Re: template cellule d'un arbre #3
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 214
Snippets: 5
Tutoriels: 0
Site web
Hors ligne
Xaviou:
Hé hé !
T'as bien mérité ton surnom de "Gourou de la secte", toi ! :lol:
Huhu mici j'adore :p (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 :p )

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 )
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» template cellule d'un arbre