错误C2064:术语不评估为采用1参数的函数 - Lambda函数

时间:2018-05-17 12:26:49

标签: c++ c++11 lambda remove-if

构建代码时出现以下错误:

  

错误C2064:术语不评估为采用1参数的函数

我阅读了有关此错误的其他帖子,并在我的lambda函数中添加了关键字this,但我仍然遇到同样的错误。 我正在尝试使用C ++ lambda函数(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 :(得分:3)

问题在于std::remove_if()的谓词应该是一元谓词。 (一元谓词只是采用单个参数并返回布尔值的函数)。

请参阅:http://en.cppreference.com/w/cpp/algorithm/remove

  

std::remove_if()

的参数      
      
  1. first,last :将迭代器转发到一系列move-assignable元素中的初始和最终位置。使用的范围是   [first,last),其中包含first和last之间的所有元素,   包括由first指向的元素,但不包括指向的元素   最后。

  2.   
  3. pred :一元函数接受范围内的元素作为参数,并返回一个可转换为bool的值。返回的值   指示是否要删除元素(如果为true,则为   去除)。该函数不得修改其参数。这可以   是函数指针或函数对象。

  4.   
[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);
 })

在这里,在 lambda函数中,您试图传递两个不可能的参数(即const Vec4f &left_lineconst Vec4f &right_line)。它应该是一个一元的谓词。

  

&#34;我阅读了有关此错误的其他帖子并添加了关键字   我的lambda函数里面有this但我仍然遇到同样的错误。&#34;

它与当前对象无关。因此,这里不需要使用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 :它尚未经过测试。