Bonsoir
J'aimerai savoir pourquoi l'operateur == n'est pas déduit automatiquement par le compilateur (comme par exemple l'operateur d'affectation, le constructeur par recopie), même dans un cas trivial ?
Si je n'implemente pas l'operator==, je ne peux pas supprimer un element d'une liste de Foo :
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 class Foo { std::string m_str; int m_value; public: Foo(const std::string& str, int value) : m_str(str) , m_value(value) { } bool operator == (const Foo& other) { return m_str == other.m_str && m_value == other.m_value; } const std::string& GetString() const { return m_str; } int GetValue() const { return m_value; } };
Avec l'operator == implementé, pas de problèmes. Sans, j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main(int argc, char **argv) { typedef std::list<Foo> ListFoo; ListFoo listFoo; listFoo.push_back( Foo("1", 0) ); listFoo.push_back( Foo("2", 0) ); listFoo.push_back( Foo("3", 0) ); listFoo.push_back( Foo("3", 1) ); listFoo.remove( Foo("3", 0) ); return 0; }
Ce qui me parait surprenant, c'est qu'il faille implémenter cet opérateur dans le cas trivial de variables membres ayant toutes l'operator== de défini.
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: no match for 'operator==' in '__first.std::_List_iterator<_Tp>::operator* [with _Tp = Foo]() == __value'
Avez vous une explication, ou bien c'est juste pour forcer le developpeur à expliciter cet operateur (dans ce cas, pourquoi ne pas faire la même chose pour l'operateur= et le constructeur par recopie ?).
--
Jérémie
Partager