Я был алгоритмом кодирования графа, и я столкнулся с этой проблемой. В C++ 11 Я пытался создать структуру, как показано ниже,Перегрузка функции C++ с помощью «константы»
struct edges{
int u , v , w ;
edges(){}
edges(int _u , int _v , int _w) {
u = _u , v = _v , w = _w ;
}
bool operator < (edges & r) {
return w < r.w ;
}
};
Итак, я написал этот код, он успешно компилируется. Но когда я называю() функции, как показано ниже, зЬй :: рода
sort(arr , arr + M) ; // here arr is an array of edges with M elements
Тогда я получаю ошибку компиляции, которая указывает на stl_algo.h номер строки . Я добавляю часть кода из stl_algo.h,
/// This is a helper function...
template<typename _RandomAccessIterator, typename _Tp>
_RandomAccessIterator
__unguarded_partition(_RandomAccessIterator __first,
_RandomAccessIterator __last, const _Tp& __pivot)
{
while (true)
{
while (*__first < __pivot) // 2242 number line
++__first;
--__last;
while (__pivot < *__last)
--__last;
if (!(__first < __last))
return __first;
std::iter_swap(__first, __last);
++__first;
}
}
Итак я нахожу решение в Интернете и получил один. Я должен перегружать оператор с Const ключевое слово, как показано ниже,
struct edges{
int u , v , w ;
edges(){}
edges(int _u , int _v , int _w) {
u = _u , v = _v , w = _w ;
}
bool operator < (const edges & r) const {
return w < r.w ;
}
};
Мой вопрос, почему я должен перегружать оператор с ключевым словом «», если постройки я называю зЬй :: рода функции()?
@SamVarshavchik Я не мог найти такого требования в стандарте. Самое близкое из них: «Предполагается, что comp не будет применять какую-либо непостоянную функцию через разыменованный итератор». Он выглядит как дефект реализации, который '__pivot' создан' const'. –
Какой компилятор/ОС? Кроме того, что такое 'arr'? Пожалуйста, предоставьте [mcve]. – Barry
компилятор g ++ 11 и ОС - debian linux (ubuntu) –