Considérez ce morceau de code :
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct MyStruct
{
int key;
std::string stringValue;
MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
bool operator < (const MyStruct& other) {
return (key < other.key);
}
};
int main() {
std::vector < MyStruct > vec;
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
std::sort(vec.begin(), vec.end());
for (const MyStruct& a : vec) {
cout << a.key << ": " << a.stringValue << endl;
}
}
Il compile bien et donne la sortie que l'on attend. Mais si j'essaie de trier les structures par ordre décroissant :
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct MyStruct
{
int key;
std::string stringValue;
MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
bool operator > (const MyStruct& other) {
return (key > other.key);
}
};
int main() {
std::vector < MyStruct > vec;
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));
vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
std::sort(vec.begin(), vec.end(), greater<MyStruct>());
for (const MyStruct& a : vec) {
cout << a.key << ": " << a.stringValue << endl;
}
}
Cela me donne une erreur. Voici le message complet :
/usr/include/c++/7.2.0/bits/stl_function.h : Dans l'instanciation de 'constexpr bool std::greater<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = MyStruct]' :
/usr/include/c++/7.2.0/bits/stl_function.h:376:20 : error : no match for 'operator>' (operand types are 'const MyStruct' and 'const MyStruct')
{ return __x > __y ; }
Il semble que c'est parce que cette fonction ici n'a pas de const
qualificatif :
bool operator > (const MyStruct& other) {
return (key > other.key);
}
Si je l'ajoute,
bool operator > (const MyStruct& other) const {
return (key > other.key);
}
Ensuite, tout va de nouveau bien. Pourquoi en est-il ainsi ? Je ne suis pas trop familier avec la surcharge d'opérateurs, donc j'ai juste mis en mémoire que nous devons ajouter la fonction const
mais c'est toujours bizarre que cela fonctionne pour operator<
sans le const
.
0 votes
Quel compilateur avez-vous utilisé ? Quelle est sa version ?
0 votes
Gcc 7.2.0 jdoodle.com/online-compiler-c++
0 votes
@Rockstart5645 ce qui est de cette pertinence ici ?