自定义排序比较函数抛出编译错误

时间:2016-10-28 23:21:03

标签: c++ sorting visual-c++

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}}

3 个答案:

答案 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]));
    }
};