Добрый вечер.
У меня есть структура triple, для которой определен оператор больше:
struct triple
{
int c, v, u;
triple(int cn, int vn, int un)
{
c = cn, v = vn, u = un;
}
bool operator >(triple n)
{
if (c > n.c)
return true;
return false;
}
};
Если я пытаюсь запустить следующий код, то программа падает с ошибкой C2678 (бинарный ">": не найден оператор, принимающий левый операнд типа "const _Ty" (или приемлемое преобразование отсутствует)):
int main()
{
triple a(10, 1, 2);
triple b(20, 2, 3);
priority_queue<triple, vector<triple>, greater<triple>> q;
q.push(a);
q.push(b);
return 0;
}
Если вне структуры объявить оператор больше с нужной сигнатурой и такой реализацией, то программа падает с ошибкой Stack overflow:
bool operator >(const triple& a, const triple& b)
{
return a > b;
}
А в такой реализации программа отрабатывает правильно и без ошибок, хотя по идее она ничем не отличается от предыдущей:
bool operator >(const triple& a, const triple& b)
{
if (a.c > b.c)
return true;
return false;
}
Сам вопрос:
Почему плюсы не могут сравнить константные выражения по ссылке так же, как и обычные?
И как можно объявить нужный оператор сравнения внутри самой структуры, чтобы он не путался под ногами вне ее определения?