#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 вы можете использовать сравнения по умолчанию (оператор космического корабля).