VC ++ 2012上的C ++中的自定义排序函数会引发以下代码的编译错误。
Error 3 error C3867: 'Segmenter::sort_fn': function call missing argument list; use '&Segmenter::sort_fn' to create a pointer to member
抛出的错误是:
{{1}}
答案 0 :(得分:4)
你需要:
sort(scanned.begin(), scanned.end(), std::bind(&Segmenter::sort_fn, this));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
不要忘记#include <functional>
。
答案 1 :(得分:1)
其他几种方法可以做到这一点。
我们不能只传入一个类方法,而不像Kerrek SB在他的回答中那样绑定实例。无论您是否使用它,方法都会有一个隐藏的this
参数。
在这种情况下看起来你没有使用它,所以静态方法可能是最简单的方法:
class Segmenter{
public:
vector<vector<float>> scanned;
void modifyAndSort();
static bool sort_fn(const vector<float>&, const vector<float>&);
};
void Segmenter::modifyAndSort(){
// Modify scanned
// ...
sort(scanned.begin(), scanned.end(), &sort_fn);
// ^ note: we need a pointer to the method.
}
bool Segmenter::sort_fn(const vector<float>& x, const vector<float>& y){
return ((x[0]*x[1]) < (y[0]*y[1]));
}
稍微复杂的同时选项是每个人的亲密朋友Lambda Function:
class Segmenter
{
public:
vector<vector<float>> scanned;
void modifyAndSort();
};
void Segmenter::modifyAndSort()
{
// Modify scanned
// ...
sort(scanned.begin(),
scanned.end(),
[](const vector<float>& x, const vector<float>& y)->bool
{
return ((x[0]*x[1]) < (y[0]*y[1]));
});
}
注意:您需要另外两个Lambdas才能获得an electric violin solo。
答案 2 :(得分:0)
std :: bind()肯定有效。
只有一个结构的简单方法。
void Segmenter::modifyAndSort(){
// Modify scanned
// ...
sort(scanned.begin(), scanned.end(), Compare());
}
struct Compare {
bool operator()(vector<int> x, vector<int> y) const {
return ((x[0]*x[1]) < (y[0]*y[1]));
}
};