Ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент - лямбда-функция - PullRequest
0 голосов
/ 17 мая 2018

Я получаю следующую ошибку при построении моего кода:

Ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент

Я прочитал другие сообщенияотносительно этой ошибки и добавил ключевое слово this в моей лямбда-функции, но я все еще получаю ту же ошибку.Я пытаюсь использовать функцию-член класса внутри другой функции-члена класса, используя лямбда-функцию C ++ (remove_if).

class LineSegments
{
public:
    LineSegments();

    float getClockwiseAngle0to180(const float &dx1, const float &dx2, const float &dy1, const float &dy2);
    void eliminateParallelLineSegments(std::vector<cv::Vec4f> &lines);
    ~LineSegments();
};

// Constructors
LineSegments::LineSegments() {}

// Destructors
LineSegments::~LineSegments() {}

float LineSegments::getClockwiseAngle0to180(const float &dx1, const float &dx2, const float &dy1, const float &dy2) {
    float dot = dx1 * dx2 + dy1 * dy2;
    float det = dx1 * dy2 - dy1 * dx2;
    float angle = -atan2(det, dot);  
    angle = angle * (180 / CV_PI);
    if (angle < 0) {
        angle = angle + 360;
    }
    if (angle >= 180) {
        angle = angle - 180;
    }

    return angle;
}

void LineSegments::eliminateParallelLineSegments(std::vector<cv::Vec4f> &lines) {

    lines.erase(remove_if(lines.begin() + 1, lines.end(), [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);
    }), lines.end());

}

Я полагаю, это простая ошибка, но я не смог ее найти большечем один час сейчас;).Это просто минимальный пример.

1 Ответ

0 голосов
/ 17 мая 2018

Проблема с предикатом вашего std::remove_if(), который должен быть унарным предикатом.(унарные предикаты - это просто функции, которые принимают один параметр и возвращают логическое значение).

См. это: http://en.cppreference.com/w/cpp/algorithm/remove

Параметры std::remove_if()

  1. первый, последний : Перенаправлять итераторы на начальные и конечные позиции в последовательности назначаемых на перемещение элементов.Используется диапазон [first, last), который содержит все элементы между first и last, включая элемент, на который указывает first, но не элемент, на который указывает last.

  2. 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 : не проверял.

...