在类内部定义std::sort
函数时,我在将其与自定义比较函数一起使用时遇到了问题。
class Test {
private:
vector< vector<int> > mat;
bool compare(vector<int>, vector<int>);
public:
void sortMatrix();
}
bool Test::compare( vector<int> a, vector<int> b) {
return (a.back() < b.back());
}
void Test::sortMatrix() {
sort(vec.begin(), vec.end(), compare);
}
我收到以下错误消息:
error: reference to non-static member function must be called
sort(vec.begin(), vec.end(), compare);
^~~~~~~
但是当我在main.cpp文件中定义compare()
和sortMatrix()
而不使用任何类时,一切工作正常,我将感谢任何帮助和建议。
8条答案
按热度按时间6ss1mwsb1#
iezvtpos2#
要调用
compare
,你需要一个Field
对象。如果你有C++11支持,你可以使用lambda从那里调用它:或者只是将比较方法移出类,反正你也不需要访问它的成员。
z9smfwbn3#
有三种方法可以做到这一点:
1.使用为结构定义的operator()创建结构
结构比较函数{
};
并以下面的方式在排序函数调用中:
标准::排序(向量开始()、向量结束()、比较函数());
1.如果你使用的是C++11版本,那么编写你的lamda函数并调用类中定义的comparator函数:
});
按照下面提到的方式在类中定义compareFun:
类测试{public:bool compareFun(向量a,向量b){返回(a.返回()〈b.返回()); }};
1.使用静态方法,正如我们的一个朋友提到的。我希望这工作。
sxissh064#
这个错误清楚地表明你正在试图访问一个非静态成员,所以,只要把它转换成静态的就行了。
3xiyfsfu5#
你可以通过在比较器排序函数前添加“static”关键字来解决这个问题。
icnyk63a6#
将“compare”函数设置为static,因为sort()函数接受静态函数指针作为参数。
u0njafvf7#
你遇到这个问题是因为你试图访问函数中的非静态访问成员,只是试图改变你的比较器。你可以使用下面的代码作为参考。
whhtz7ly8#
你可以在比较函数之前使用static。
因为
1.因为非静态成员函数有一个隐式的第一个参数,这就是它们访问其他成员的方式。
如果你想在类外调用comp函数,那么你可以这样写代码
因此,这被视为3个参数,而不是2个参数。
排序代码在类之外,必须使用上面的语法。
将成员设置为静态将允许以下调用:
它只有2个参数,并且与 predicate std::sort期望的匹配。