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:
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;
}
et l'erreur du compilateur est:
Citation Envoyé par gcc 4.4.1
-------------- Build: Debug in stl_vector_test ---------------

Compiling: main.cpp
/.../main.cpp: In member function ‘size_t B<A<Membertype> >::Add(const B<A<Membertype> >&, const Membertype&)’:
/.../main.cpp:36: error: expected ‘;’ before ‘it’
/.../main.cpp:37: error: ‘it’ was not declared in this scope
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
L'erreur intervient donc ici:
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)
Comme si le const_iterator n'existait pas

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):
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;
}
Quand au message d'erreur complet, (sans le -Wfatal-errors) c'est celui-ci:
Citation Envoyé par gcc 4.4.1
-------------- Build: Debug in stl_vector_test ---------------

Compiling: main.cpp
/.../main.cpp: In member function ‘size_t FaceBase<EigMemberProps<T, U> >::AddFace(const CenteredFace&, const U&)’:
/.../main.cpp:66: error: expected primary-expression before ‘(’ token
/.../main.cpp:66: error: expected primary-expression before ‘)’ token
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
L'erreur intervient donc sur la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
  members.push_back(EigMemberProps<T,U>(U) );
ou il ne semble pas reconnaître le push_back...

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