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

C++ Discussion :

Problème avec templates et iterateurs :(


Sujet :

C++

  1. #1
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut Problème avec templates et iterateurs :(
    Salut les gars !!
    je suis en train de faire une classe dérivée qui a pour but de faire une liste d'adjacence à partir de la structure d'un arbre.
    La classe de base est tree.hh qui est une distribution GNU qui se trouve sur internet.
    Ma classe PQRTree (derivée de tree) a un attribut _index. Chaque noeud a un index (tattoo) différent afin de faire une liste d'adjacence Par exemple :
    (0,1), (0,2) (1,3) (1,4) (1,5) (2,6) voudrais dire que 0 est le noeud racine duquel dependent le noeud 1, 2 et 3. Le noeud 1 a 3, 4, 5 comme fils. 2 a 6 comme fils.

    Mon problème c'est que quand je essay de compiler mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include "tree.h"
     
    template<typename T>struct Vertex
    {
    public:
    	Vertex();
    	Vertex(T * iT) : _data(iT){}; 
    	~Vertex(){/*delete _data;*/};
    	T * getData() const {return (_data);};
     
    	void setIndex(int iIndex){_index=iIndex;};
    	int getIndex(){return _index;};
     
    private:
    	T * _data;
    	int _index;
    };
     
     
    typedef Vertex<PQR>* node_t;
     
    template<typename tree_node_allocator = std::allocator<tree_node_<node_t> > >
    class PQRTree : public tree <Vertex<PQR>* , tree_node_allocator> 
    {
    public : 
    	PQRTree() : _nbInd(0){};
    	virtual ~PQRTree(){};
     
     
    	template <typename iter>
    	iter add_child(iter position, Vertex<PQR>* iVertex)
    	{
    		iter aIter;
    		std::pair<int, int> aPair;
     
    		aIter = append_child(position, iVertex);
    		iVertex->setIndex(++_nbInd);
     
    		//setting _PQT pairs 
    		aPair.first = (*position)->getIndex();
    		aPair.second = (*aIter)->getIndex();
    		_PQT.push_back(aPair);
     
     
    		return aIter;
    	};
     
    	template <typename iter>
    	void resetPQT()
    	{
    	_PQT.clear();
    	iter aIter;
    	//tree<node_t>::breadth_first_iterator aIter;
    	std::pair<int, int> aPair;
     
    	for (aIter = this.begin_breadth_first(); aIter != this.end_breadth_first(); aIter++)
      		{
    		aPair.first = (*aIter)->getIndex();
    		//aPair.second = (*aIter)->getIndex();
    		aPair.second = 69;
    		_PQT.push_back(aPair);		
    		}
    	}
     
    	std::vector<std::pair<int,int> > getPQT()
    	{
    		return _PQT;
    	};
     
     
    private :
    	int _nbInd;
    	std::vector<std::pair<int,int> > _PQT;
     
    };
    ... et c'est la fonction resetPQT() qui me rend fou parce que je ne sais pas comment utiliser ici les iterateurs lors de l'héritage...
    resetPQT() a pour but refaire la liste d'adjacence lors d'une modif dans l'arbre tel que l'effaçage d'un noeud ou un sous-arbre...
    J'arrive pas...
    C'est un problème de templates et d'heritage?

    Le code de tree.hh je voulais le mettre mais il est trop long pour le forum
    vous pouvez le trouver inmediatement sur http://www.aei.mpg.de/~peekas/tree/

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    //.... quelques déclarations...
     
    PQRTree<> aPQRTree3
    PQRTree<>::iterator root3, aIter, aIterTest;  
     
      //setting the root
      aPQR = new PQR_TST("Jeronimo",0);
      Vertex<PQR>* aVertex = new Vertex<PQR>(aPQR);
      root3 = aPQRTree3.begin();  
      aIter = aPQRTree3.insert(root3, aVertex); //iter ??
      std::cout<<"index root->"<<aPQRTree3.index(aIter)<<std::endl;
     
     
      //setting level 1
      aPQR = new PQR_TST("Perico",1);
      aVertex = new Vertex<PQR>(aPQR);
      //aPQRTree3.append_child(aIter, aVertex);
      aIterTest=aPQRTree3.add_child(aIter, aVertex);
      std::cout<<"index Perico->"<<aPQRTree3.index(aIterTest)<<std::endl;
     
      aPQR = new PQR_TST("Sylvain",2);
      aVertex = new Vertex<PQR>(aPQR);
      //aIter = aPQRTree3.append_child(aIter, aVertex);
      aIter = aPQRTree3.add_child(aIter, aVertex);
      std::cout<<"index Sylvain->"<<aPQRTree3.index(aIter)<<std::endl;
     
      //setting level 2
      aPQR = new PQR_TST("Vanessa",3);
      aVertex = new Vertex<PQR>(aPQR);
      //aPQRTree3.append_child(aIter, aVertex);
      aIterTest = aPQRTree3.add_child(aIter, aVertex);
      std::cout<<"index Vanessa->"<<aPQRTree3.index(aIterTest)<<std::endl;
     
      aPQR = new PQR_TST("Vicente",4);
      aVertex = new Vertex<PQR>(aPQR);
      //aPQRTree3.append_child(aIter, aVertex);
      aIterTest = aPQRTree3.add_child(aIter, aVertex);
      std::cout<<"index Vanessa->"<<aPQRTree3.index(aIterTest)<<std::endl;
     
        //displaying the tree content
      PQRTree<>::breadth_first_iterator scanner4;	
      for (scanner4 = aPQRTree3.begin_breadth_first(); scanner4 != aPQRTree3.end_breadth_first(); scanner4++)
      {
    	(*scanner4)->getData()->display();		
    	std::cout<<"index: "<<(*scanner4)->getIndex()<<std::endl;
      }
      std::cout<<std::endl;
     
     
    std::vector<std::pair<int,int> > aPQT = aPQRTree3.getPQT();
     
    std::vector<std::pair<int,int> >::iterator aPQTIter;
     
    	for(aPQTIter = aPQT.begin(); aPQTIter != aPQT.end(); aPQTIter++)
    		std::cout<<"("<<(*aPQTIter).first<<","<<(*aPQTIter).second<<") ";
    std::cout<<std::endl;
     
    aPQRTree3.resetPQT();
    Est-ce quelqu'un peut m'aider avec ce ça ?

    Je vous remercie énormement !!

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Et bien déjà, que dit ton compilateur ?

    Deuxième question, faire des méthodes add_child et resetPQT des méthodes templates était-il vraiment nécessaire ? Ce doit être lourd a utiliser non ?

  3. #3
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Le compilateur me dit :
    test2.cpp:187: error: no matching function for call to ‘PQRTree<std::allocator<tree_node_<Vertex<PQR>*> > >::resetPQT()’
    (c'est la dernière ligne du main, là où j'appele la fuction resetPQT()).

    Mis à part cette méthode (que j'aimerais bien savoir comment resoudre)... qu'est ce que tu proposerais comme solution ?

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    resetPQT() est un membre avec un paramètre template. Or celui-ci n'est pas déductible et n'est pas spécifié explicitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aPQRTree3.resetPQT<UnIterateurMaisMoiJeNeSaisPasLeQuel>();
    J'ai pas été voir plus loin, mais il me semble qu'il y a aussi des problèmes de conception.

  5. #5
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut
    Avant tout merci !
    Mais pourrais tu etre plus précis stp ?
    J'ai des problèmes et je ne sais pas comment le resoudre...

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Bon je ne parlerais pas des problèmes de conceptions évoqués par Jean Marc car ça demande de se plonger dans le code un peu plus. Mais déjà essaye d'écrire ta fonction reset comme ça :

    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
     
    public:
      typedef tree <Vertex<PQR>* , tree_node_allocator> VertexTree;
     
      void resetPQT()
      {
        _PQT.clear();
     
        for (
               VertexTree::iterator aIter = this.begin_breadth_first();
               aIter != this.end_breadth_first();
               ++aIter
             )
          _PQT.push_back( 
                  std::make_pair( (*aIter)->getIndex(), 69 )
                  );
      }

Discussions similaires

  1. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  2. XSLT - Problème avec template match
    Par chris3544 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/07/2009, 08h23
  3. Problème avec template + héritage
    Par vincepoencet dans le forum Langage
    Réponses: 10
    Dernier message: 21/09/2008, 22h09
  4. [PHPLIB] Problème avec Template PHPLib
    Par bobic dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 19/11/2006, 18h07
  5. [XSLT] Problème avec apply-templates
    Par NeoMan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/12/2005, 14h45

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