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 de type dans les templates - typedef bis


Sujet :

C++

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    620
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 620
    Par d�faut probl�me de type dans les templates - typedef bis
    Bonjour,

    Dans la s�rie explorons le merveilleux pays des templates, je bute sur un souci que je ne sais par quel bout prendre. J'ai, dans un fichier typedef.h, les typedef suivants :

    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
    template<class TLine> class Node;
    class Line;
    template <class LineType> class ItSegment;
     
    template <class TLine> class NodeWrapper{};
     
    template<> class NodeWrapper<Line>
    {
     public:
      typedef list<Node<Line>*>::iterator iter;
      typedef list<Node<Line>*>::const_iterator c_iter;
      typedef list<Node<Line>*>::iterator& ref_iter;
      typedef list<Node<Line>*>::const_reverse_iterator cr_iter;
      typedef list<Node<Line>*>::const_iterator& ref_c_iter;
      typedef Node<Line> NodeType;
      typedef Node<Line>* pNodeType;
      typedef Node<Line>& rNodeType;
      typedef Line line;
    };
     
     
     
    template<class LineType> class TitSegment
    {};
     
    template<> class TitSegment<Line>
    {
     public:
      typedef ItSegment< Line > iter;
      typedef const ItSegment< Line > c_iter;
      typedef Node<Line> NodeType;
      typedef Node<Line>* pNodeType;
      typedef Node<Line>& rNodeType;
      typedef Line line;
    };
    On d�finit une classe ItSegment, qui ressemble � ceci (j'oublie les focntions membres, c'est le constructeur copi� ici qui pose probl�me) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template< class LineType > class ItSegment
      {
      public:
        ItSegment(NodeWrapper<LineType>::iter itnode0,
                  NodeWrapper<LineType>::iter itnode1)
        { psegment = new Segment<LineType>(itnode0,itnode1); }
     
      private:
     
       Segment<LineType>* psegment;
    };
    Et la classe Segment ressemble � ceci (pareil, j'ai cutt� tout plein de d�tails) :

    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
    template< class LineType> class Segment
    {
    public:
     
      bool CheckConsistency(typename NodeWrapper<LineType>::line** pline);
      Segment(typename NodeWrapper<LineType>::ref_c_iter itnode0,
              typename NodeWrapper<LineType>::ref_c_iter itnode1)
        :itfirstnode(itnode0),itsecondnode(itnode1)
      {}
    private:
     
      //! iterator to the first node
      typename NodeWrapper<LineType>::iter itfirstnode;
     
      //! iterator to the second node
      typename NodeWrapper<LineType>::iter itsecondnode;
    };
    et j'obtiens � la compilation un superbe :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    itsegment.hpp|56| erreur: expected ‘)’ before ‘itnode0’
    si je mets un typename dans les param�tres du constructeur de ItSegment, �a donne :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    itsegment.hpp|58| erreur: no matching function for call to ‘Segment<Line>::Segment(NodeWrapper<Line>::iter&, NodeWrapper<Line>::iter&)’
    segment.hpp|62| note: candidats sont: Segment<TLine>::Segment(typename NodeWrapper<LineType>::ref_c_iter, typename NodeWrapper<LineType>::ref_c_iter) [with LineType = Line]
    segment.hpp|45| note:                 Segment<Line>::Segment(const Segment<Line>&)
    Si vous avez des suggestions, je suis preneur... je ne comprends pas encore bien le passage des types dans les templates, je dois bien reconna�tre...

    Merci beaucoup

    Marc

  2. #2
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    620
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 620
    Par d�faut
    Ah ! et la fonction appelante ressemble � ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TitSegment<Line>::iter Line::GetFirstSegment()
    {
     
      // iterators on the nodes of the first segment
      NodeWrapper<Line>::iter itnode0=_nodes.begin();
      NodeWrapper<Line>::iter itnode1=itnode0;
      ++itnode1;
     
      // create the corresponding ItSegment
      return TitSegment<Line>::iter(itnode0,itnode1);
     
    }

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    620
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 620
    Par d�faut
    Bon, apr�s ajout de quelques typename qui devaient manquer, j'en suis au m�me point : ce passage l� ne pla�t pas du tout :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
       ItSegment(typename NodeWrapper<LineType>::ref_c_iter itnode0,
                  typename NodeWrapper<LineType>::ref_c_iter itnode1)
        { psegment = new Segment<LineType>(itnode0,itnode1); }
    donne, � l'instanciation :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    line.C|264| erreur: no matching function for call to ‘ItSegment<Line>::ItSegment(NodeWrapper<Line>::iter&, NodeWrapper<Line>::iter&)’
    itsegment.hpp|84| note: candidats sont: ItSegment<LineType>::ItSegment(const ItSegment<LineType>&) [with LineType = Line]
    itsegment.hpp|56| note:                 ItSegment<LineType>::ItSegment(typename NodeWrapper<LineType>::ref_c_iter, typename NodeWrapper<LineType>::ref_c_iter) [with LineType = Line]
    Est-ce qu'on ne peut pas utiliser les types d�finis dans les classes en guise de typedef comme type des param�tres dans les fonctions ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Est ce que quelque chose comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    typename NodeWrapper<LineType>::ref_c_iter i = itnode0;
    Compile ?

    Si ce n'est pas le cas alors tu auras la raison, il n'arrive pas � trouver de constructeur pour matcher les param�tre, sinon je ne sais pas. (un code minimal pour tester si tu arrives � en faire un, ca serait pratique)

  5. #5
    screetch
    Invit�(e)
    Par d�faut
    l'un prend des iterateur
    l'autre des references sur un const_iterateur
    ces deux types ne sont pas compatibles, il faut au moins que le const match
    de plus je ne crois pas que les references soient bienvenues ici. Au mieux elles rendent le code confus, au pire tu vas autoriser la modification de ce sur quoi la reference pointe.
    Je crois (pas sur) que tu voulais utiliser des references const sur des iterateurs, et au lieu de ca tu utilises des references sur des iterateurs const, et c'est pas pareil.

  6. #6
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    620
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 620
    Par d�faut
    Salut Screetch,

    Tu as vu juste, merci infiniment !!! :-)

    Marc

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 13
    Dernier message: 24/09/2010, 15h41
  2. Probl�me de Type dans une table li�e
    Par tangueros78 dans le forum Access
    R�ponses: 19
    Dernier message: 16/03/2006, 09h14
  3. Probl�me d'affichage dans les textbox
    Par popinenhbourg dans le forum Servlets/JSP
    R�ponses: 8
    Dernier message: 28/02/2006, 12h09
  4. Probl�me d'affichage dans les textbox
    Par popinenhbourg dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 7
    Dernier message: 28/02/2006, 11h36
  5. [VB.NET] [D�butant] Probl�me de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 07/03/2005, 13h13

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