Bonjour à tous,
J'ai le sentiment que ma question est sans doute idiote, mais impossible de trouver la solution !
Alors, je me permet de me tourner ves vous...

J'ai des objets de type T dont je veux faire une liste ordonnée.
J'ai donc défini une relation d'ordre qui porte sur le champ ref_ de T.

Voici une partie de ma classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
class DesT {
  public :
...
    void Ajoute (const T & c);
...
  private :
    typedef std::set<T, OrdreT> TypeListe;
    typedef TypeListe::const_iterator It;
    typedef TypeListe::iterator Wit;
    TypeListe liste_;
};
Le problème se pose à l'écriture de la méthode DesT::Ajoute.
Je veux trouver s'il y a dans ma liste un objet ayant la même ref_ que l'objet à insérer, et si c'est le cas, je veux surcharger cet objet.
Voilà ce que j'ai écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
void DesT::Ajoute (const T & c) {
  std::pair<DesT::Wit, bool> p = liste_.insert (c);
  if (p.second == false) { // déjà un obj ayant cette ref_
    DesT::Wit it = p.first;
    T & cref = *it; // <<== Erreur de compilation
    cref += c;
    }
  }
J'ai l'erreur suivante à la ligne marquée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 In member function `void DesT::Ajoute(const T&)':
error: could not convert 
  `(&it)->std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::operator*() const 
  [with _Val = T, _Ref = const T&, _Ptr = const T*]()' 
to `T&'
D'habitude, j'utilise toujours les containeurs de la STL avec des pointeurs,
et je n'ai donc jamais vu ce problème... L'accès (*it) ne rend pas une référence sur un objet ?

Merci de m'expliquer ce qu'il se passe...
Est-ce interdit de modifier en place un élément d'un std::set ?