T& à partir d'un std::set<T>::iterator
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:
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:
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:
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 ?