带有自定义比较函数的 std::sort 函数结果错误:必须调用对非静态成员函数的引用

Len*_*art 11 c++ sorting reference non-static

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);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

error: reference to non-static member function must be called
        sort(vec.begin(), vec.end(), compare);
                                     ^~~~~~~
Run Code Online (Sandbox Code Playgroud)

然而compare(),当我sortMatrix()在没有任何类的文件 main.cpp 中定义和时,一切正常。我将不胜感激任何帮助和建议。

arp*_*714 19

Make your comparator function static. It will work.
Run Code Online (Sandbox Code Playgroud)

  • 它确实有效,但为什么呢? (5认同)
  • 您能解释一下为什么我们需要将比较器函数更改为静态吗? (3认同)

小智 6

有三种方法可以做到这一点:

  1. 创建一个结构体,并为该结构体定义了operator()

    结构比较函数 {

     inline bool operator() (const vector<int> &a, const vector<int> &b)
     {
         return (a.back() < b.back());
     }
    
    Run Code Online (Sandbox Code Playgroud)

    };

    并按以下方式调用排序函数:

    std::sort(vect.begin(),vect.end(),compareFunc());

  2. 如果您使用的是 C++11 版本,则编写 lamda 函数并调用类中定义的比较器函数:

     std::sort(vec.begin(), vec.end(), [this](vector<int> a, vector<int> b){
                 return (compareFun(a,b));
    
    Run Code Online (Sandbox Code Playgroud)

    });

    按照下面提到的方式在您的类中定义compareFun:

    类测试 { public: boolcompareFun(向量 a, 向量 b) { return (a.back() < b.back()); } } };

  3. 正如我们的一位朋友提到的,使用静态方法。我希望这能起作用。


Som*_*ken 5

调用compare你需要一个Field对象。如果您有 C++11 支持,您可以使用 lambda 从那里调用它:

sort(vec.begin(), vec.end(), [this] (vector<int> a, vector<int> b) {
    return compare(a, b); });
Run Code Online (Sandbox Code Playgroud)

或者只是将您的比较方法移出类,无论如何您都不需要访问它的成员。