构建代码时出现以下错误:
错误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());
}
我想这是一个简单的错误,但我现在找不到一个多小时了;)。这只是一个很小的例子。
答案 0 :(得分:3)
问题在于std::remove_if()
的谓词应该是一元谓词。 (一元谓词只是采用单个参数并返回布尔值的函数)。
请参阅:http://en.cppreference.com/w/cpp/algorithm/remove
的参数
std::remove_if()
first,last :将迭代器转发到一系列move-assignable元素中的初始和最终位置。使用的范围是 [first,last),其中包含first和last之间的所有元素, 包括由first指向的元素,但不包括指向的元素 最后。
- 醇>
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);
})
在这里,在 lambda函数中,您试图传递两个不可能的参数(即const Vec4f &left_line
和const 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 :它尚未经过测试。