C++ C++;对对象向量排序,获取错误C3867函数调用缺少参数列表?
我目前正在写一个程序来检测车牌文本。我有一个包含成员变量的类PossiblePlate,在主要的一点上,我想按照模板中检测到的字符数,按降序对PossiblePlate对象的向量进行排序,该模板位于成员变量strChars中。以下是相关代码: 大体上:C++ C++;对对象向量排序,获取错误C3867函数调用缺少参数列表?,c++,sorting,vector,C++,Sorting,Vector,我目前正在写一个程序来检测车牌文本。我有一个包含成员变量的类PossiblePlate,在主要的一点上,我想按照模板中检测到的字符数,按降序对PossiblePlate对象的向量进行排序,该模板位于成员变量strChars中。以下是相关代码: 大体上: std::sort(vectorOfPossiblePlates.begin(), vectorOfPossiblePlates.end(), PossiblePlate::sortDescendingByNumberOfChars); Pos
std::sort(vectorOfPossiblePlates.begin(), vectorOfPossiblePlates.end(), PossiblePlate::sortDescendingByNumberOfChars);
PossiblePlate.h(到目前为止,我可能会添加更多):
main中的第44行是上面main中调用std::sort的行
我以前在其他程序中也做过同样的事情,没有问题。我在这里所做的一切都与我过去所做的一致,也与其他堆栈溢出帖子一致,例如:
谁能告诉我我做错了什么?我在这里不知所措,任何帮助都将不胜感激。发布的代码中有几个问题 首先,传递给
std::sort
的函数必须可以用两个排序类型的参数调用PossiblePlate::sortDescendingByNumberOfChars
是一个非静态成员函数,因此必须对类型为PossiblePlate
的对象调用它,并使用两个附加参数<代码>标准::排序无法处理此问题。使其成为静态成员函数
其次,PossiblePlate.cpp定义了一个名为sortDescendingByNumberOfChars
的自由函数;没关系,但这不是成员函数。将其声明从sortDescendingByNumberOfChars
更改为PossiblePlate::sortDescendingByNumberOfChars
,以定义成员函数
第三,遵循错误消息中的建议。要获取成员函数的地址,正确的语法是
&ClassName::FunctionName
。代码中的调用没有&
已发布的代码中有几个问题
首先,传递给std::sort
的函数必须可以用两个排序类型的参数调用PossiblePlate::sortDescendingByNumberOfChars
是一个非静态成员函数,因此必须对类型为PossiblePlate
的对象调用它,并使用两个附加参数<代码>标准::排序无法处理此问题。使其成为静态成员函数
其次,PossiblePlate.cpp定义了一个名为sortDescendingByNumberOfChars
的自由函数;没关系,但这不是成员函数。将其声明从sortDescendingByNumberOfChars
更改为PossiblePlate::sortDescendingByNumberOfChars
,以定义成员函数
第三,遵循错误消息中的建议。要获取成员函数的地址,正确的语法是
&ClassName::FunctionName
。代码中的调用没有应答的&
,std::sort不能与非静态成员函数一起工作。使用静态函数的替代方法是lambda函数或functor(函数运算符)。@rcgldr-或使用自由函数,如PossiblePlate.cpp中定义的函数。但这不是这个问题的重点。我只是想提醒OP潜在的问题和备选方案。正如所回答的,std::sort不能用于非静态成员函数。使用静态函数的替代方法是lambda函数或functor(函数运算符)。@rcgldr-或使用自由函数,如PossiblePlate.cpp中定义的函数。但这不是这个问题的重点。我只是想提醒OP潜在的问题和替代方案。
// PossiblePlate.h
#ifndef POSSIBLEPLATE_H
#define POSSIBLEPLATE_H
#include <string>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
///////////////////////////////////////////////////////////////////////////////////////////////////
class PossiblePlate {
public:
// member variables ///////////////////////////////////////////////////////////////////////////
cv::Mat imgPlate;
cv::Mat imgGrayscale;
cv::Mat imgThresh;
std::vector<cv::RotatedRect> locationOfPlateInScene;
std::string strChars;
///////////////////////////////////////////////////////////////////////////////////////////////////
bool sortDescendingByNumberOfChars(const PossiblePlate &ppLeft, const PossiblePlate &ppRight);
};
#endif // end #ifndef POSSIBLEPLATE_H
// PossiblePlate.cpp
#include "PossiblePlate.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
bool sortDescendingByNumberOfChars(const PossiblePlate &ppLeft, const PossiblePlate &ppRight) {
return(ppLeft.strChars.length() < ppRight.strChars.length());
}
Error 1 error C3867: 'PossiblePlate::sortDescendingByNumberOfChars': function call missing argument list; use '&PossiblePlate::sortDescendingByNumberOfChars' to create a pointer to member c:\visualstudio2013progs\cpp\licenseplaterecognition1\main.cpp 44 1 LicensePlateRecognition