Bonjour.
Récemment, en compilant une classe, je me suis aperçu que le compilateur ne trouvait plus la méthode push_back d'un vector. La classe étant relativement compliquée et faisant appel à d'autres classes, j'ai décidé d'essayer d'en réécrire une autre et de reproduire le comportement... ce que je n'ai pas réussi à faire... mais j'ai par contre trouvé une autre erreur .
Je soumet donc d'abord l'erreur de la classe simplifiée.
Le code est le suivant:et l'erreur du compilateur est:
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 //main.cpp //Classes de test #include <vector> template <class Membertype> class A { Membertype u; public: A(){} A(const Membertype & b):u(b){} }; template <class Membertype> class B { private : B(); }; template <class Membertype> class B<A<Membertype> > { std::vector<A<Membertype> > members; public: B(){} B(const B &b):members(b.members){} size_t Add(const B &, const Membertype &); }; template <class Membertype> size_t B<A<Membertype> >::Add(const B &b, const Membertype &U) { members.reserve(b.members.size()+1); members.push_back(A<Membertype>(U) ); //[ERREUR] for(std::vector< A< Membertype> >::const_iterator it=b.members.begin(); it!=b.members.end();++it) //[/ERREUR] members.push_back(*it); return members.size(); } int main() { return 0; }L'erreur intervient donc ici:Envoyé par gcc 4.4.1
Comme si le const_iterator n'existait pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for(std::vector< A< Membertype> >::const_iterator it=b.members.begin(); it!=b.members.end();++it)
Voila pour la version simple.
Pour la version compliquée je préfere donner un lien sur codepad (lisibilité oblige, le code n'étant pas scrollé).
Voici le code (pour le permanence):Quand au message d'erreur complet, (sans le -Wfatal-errors) c'est celui-ci:
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 template <typename DisType, class Member> class EigMemberProps : public Member { protected: //Null if not set. DisType average_distance; DisType sum; DisType numentry; public: EigMemberProps(); EigMemberProps(const Member & _m, DisType _d=0); EigMemberProps(const EigMemberProps<DisType,Member> & ); }; template <typename DisType, class Member> EigMemberProps<DisType,Member>::EigMemberProps() :Member(),average_distance(0),sum(0),numentry(0) { } template <typename DisType, class Member> EigMemberProps<DisType,Member>::EigMemberProps(const Member & _m, DisType _d) :Member(_m),average_distance(_d),sum(_d),numentry(_d==0?0:1) { } template <typename DisType, class Member> EigMemberProps<DisType,Member>::EigMemberProps (const EigMemberProps<DisType,Member> & _e) :Member(_e),average_distance(_e.average_distance), numentry(_e.numentry),sum(_e.sum) { } #include <vector> class CenteredFace { }; template < class Props> class FaceBase { private: FaceBase(); }; template < class T,class U> class FaceBase<EigMemberProps<T,U> > { protected: std::vector< EigMemberProps<T,U> > members; public: size_t AddFace(const CenteredFace &,const U &); }; template < class T,class U> size_t FaceBase<EigMemberProps<T,U> >::AddFace(const CenteredFace & C,const U &) { //[EREUR] members.push_back(EigMemberProps<T,U>(U) ); //[/ERREUR] return (members.size()-1); } int main() { return 0; }L'erreur intervient donc sur la ligne:Envoyé par gcc 4.4.1ou il ne semble pas reconnaître le push_back...
Code : Sélectionner tout - Visualiser dans une fenêtre à part members.push_back(EigMemberProps<T,U>(U) );
Si vous avez une idée sur l'origine de l'erreur ...
Merci d'avoir lu le post jusqu'ici (il est relativement long ). J'espère que c'est une bêtise de ma part, mais depuis 2 jours, je suis bloqué sur cette erreur sans arriver à la résoudre
Partager