@EzikBro

Почему std::greater() не работает с самонаписанной структрурой?

Добрый вечер.
У меня есть структура 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;
}


Сам вопрос:
Почему плюсы не могут сравнить константные выражения по ссылке так же, как и обычные?
И как можно объявить нужный оператор сравнения внутри самой структуры, чтобы он не путался под ногами вне ее определения?
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
Нужна const-корректность, также важно отсутствие лишнего копирования. Пример оператора, определённого в классе:
bool operator >(const triple& n) const
{
    return c > n.c;
}

А вообще, такое ощущение, что весь класс можно заменить на:
using triple = std::tuple<int, int, int>;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы