Проблема с предикатом вашего std::remove_if()
, который должен быть унарным предикатом.(унарные предикаты - это просто функции, которые принимают один параметр и возвращают логическое значение).
См. это: http://en.cppreference.com/w/cpp/algorithm/remove
Параметры std::remove_if()
первый, последний : Перенаправлять итераторы на начальные и конечные позиции в последовательности назначаемых на перемещение элементов.Используется диапазон [first, last), который содержит все элементы между first и last, включая элемент, на который указывает first, но не элемент, на который указывает last.
pred: Унарная функция, которая принимает элемент в диапазоне в качестве аргумента и возвращает значение, конвертируемое в bool.Возвращаемое значение указывает, должен ли элемент быть удален (если true, он удален).Функция не должна изменять свой аргумент.Это может быть либо указатель на функцию, либо функциональный объект.
[this] (const Vec4f &left_line, const Vec4f &right_line)
{
return (abs((getClockwiseAngle0to180(0, left_line[2] - left_line[0], 1, left_line[3] - left_line[1]) - getClockwiseAngle0to180(0, right_line[2] - right_line[0], 1, right_line[3] - right_line[1]))) < 2);
})
Здесь, в вашей лямбда-функции вы пытаетесь передать два аргумента (то есть const Vec4f &left_line
и const Vec4f &right_line
), что невозможно.Это должен быть унарный предикат.
"Я прочитал другие посты об этой ошибке и добавил ключевое слово this
в свою лямбда-функцию, но я все еще получаю ту же ошибку."
Это не имеет ничего общего с текущим объектом.Следовательно, здесь нет необходимости использовать this
.Вы также можете определить независимую функцию, так как вы используете вектор объектов этого класса.Или, другими словами, вы можете определить getClockwiseAngle0to180()
как функцию, не являющуюся членом.
Возможным решением может быть что-то вроде следующего.
auto left_line = Vec4f[1]; // as per your first element of your vector(Vec4f) that you want as lhs
lines.erase(std::remove_if(lines.begin() + 1, lines.end(),
[&] (Vec4f& right_line)->bool
{
auto temp = abs((getClockwiseAngle0to180(0, left_line[2] - left_line[0], 1, left_line[3] - left_line[1]) -
getClockwiseAngle0to180(0, right_line[2] - right_line[0], 1, right_line[3] - right_line[1]));
left_line = right_line; // now your left_line = right_line
return temp < 2 ;
}), lines.end());
PS : не проверял.