C поиск класса в векторе с использованием std::find вызывает ошибки

#c #class #vector

#c #класс #вектор

Вопрос:

Я пытаюсь найти объект SnekNode в std::vector, используя

     auto it = std::find(snek_node_container.begin(), snek_node_container.end(), snek_node);
  

но это вызывает ошибку компилятора:

Ошибка C2676 двоичный файл ‘==’: ‘SnekNode’ не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора

что указывает на файл xutility в качестве источника, что не очень полезно. Когда я пытаюсь определить функцию == в классе, например:

         SnekNode operator== (const SnekNodeamp; rhs) {
        return (*this == rhs);
    }
  

Я получаю еще одну ошибку компиляции:

C2451 условное выражение типа «SnekNode» является незаконным

что также указывает на файл xutility, который, опять же, к сожалению, мне не помогает. Что я здесь делаю не так? Заранее спасибо!

Комментарии:

1. operator== должен вернуться bool или что-то конвертируемое bool .

2. Ошибка буквально говорит о том, что не так с вашим кодом

3. Кроме того, ваше определение оператора создает бесконечную рекурсию. Вам нужно фактически сравнить каждый элемент самостоятельно (или использовать C 20 и =default )

4. А) operator == обычно должен возвращать bool , Б) как вы его определили, этот оператор бесконечно рекурсивен, потому что он вызывает сам себя… как это должно работать?

Ответ №1:

operator== должен возвращать bool.

Кроме того, вам необходимо сравнить элементы по отдельности. В вашем коде вы просто вызываете operator== снова, вызывая бесконечную рекурсию.

Что вы можете сделать, так это использовать operator== in operator!= для сохранения ввода, например:

 struct SnekNode
{
    bool operator== (const SnekNodeamp; rhs) const {
        return a == rhs.a amp;amp;
            b == rhs.b amp;amp; 
            c == rhs.c;
    }

    bool operator!= (const SnekNodeamp; rhs) const {
        return !(*this == rhs);
    }

    // auto operator<=>(const SnekNodeamp;) const = defau< // C  20

    int a{0};
    int b{1};
    int c{2};
};
  

С C 20 вы можете использовать сравнения по умолчанию (оператор космического корабля).

Живая демонстрация