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 :
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
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; };
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 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 j'obtiens à la compilation un superbe :
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; };
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 itsegment.hpp|56| erreur: expected ) before itnode0
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...
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>&)
Merci beaucoup
Marc
Partager