Рассмотрим этот фрагмент кода:
#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;
}
}
Он компилируется отлично и дает результат, которого можно было бы ожидать. Но если я попытаюсь отсортировать структуры в порядке убывания:
#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;
}
}
Это дает мне ошибку. Вот полное сообщение:
/usr/include/c++/7.2.0/bits/stl_function.h: В экземпляре 'constexpr bool std :: больше <_Tp> :: operator() (const _Tp &, const _Tp &) const [с _Tp = MyStruct ]:
/usr/include/c++/7.2.0/bits/stl_function.h:376:20: ошибка: нет соответствия для 'operator>' (типы операндов: 'const MyStruct' и 'const MyStruct')
{return __x> __y; } }
Похоже, что эта функция прямо здесь не имеет определителя const
:
bool operator > (const MyStruct& other) {
return (key > other.key);
}
Если я добавлю его,
bool operator > (const MyStruct& other) const {
return (key > other.key);
}
Тогда все хорошо. Почему это так? Я не слишком хорошо знаком с перегрузкой оператора, поэтому я просто поместил его в память, что нам нужно добавить const
но все же странно, почему она работает для operator<
без const
.