0

我有一个基本上看起来像这样的类(我删除了不必要的代码):

class WilxList {
private:    
    struct Test{
        double number;
        int sign;
        int rank;
    };
    bool testSorter(const Test & x1, const Test & x2);
public: 
    WilxList(std::vector<double> &argNumbers, std::string argName, int numberOfTests);
};

我正在尝试对这样的测试结构向量进行排序:

WilxList::WilxList(std::vector<double> &argNumbers, std::string argName, int numberOfTests)
{
    //Omitted code
    std::vector<Test> sortedTests;
    //Omitted code where Tests are created and added to the vector inside for loop
    std::sort(sortedTests.begin(), sortedTests.end(), testSorter); //ERROR

}

我得到的错误是:

error C3867: 'WilxList::testSorter': function call missing argument list; 
use '&WilxList::testSorter' to create a pointer to member
c:\users\stenver\documents\visual studio 2012\projects\wilxoniastakutest\wilxoniastakutest\wilxlist.cpp 
4

4 回答 4

5

testSorter是导致困难的类的非静态成员函数。WilxList使用指向非静态成员函数的函数指针相对比较困难,并且不可能在期望像sort算法这样的自由(或静态成员)函数的情况下使用。

解决此问题的一种方法是移动testSorter结构本身并将其重命名为operator<. 这会让你做类似的事情x1<x2,你可以调用 sortstd::sort(sortedTests.begin(), sortedTests.end());假设函数实际上表示一个<操作,如果它不是,它可能会变得混乱并且将其设为静态成员函数会更整洁。无论哪种情况,错误都会消失。

于 2012-11-20T01:33:50.303 回答
1

问题是比较器函数是一个成员函数,这std::sort是不期望的。

您可以通过多种方式解决此问题:第一种是制作比较器函数static,另一种是使其成为独立函数,第三种方法是使用 C++11 lambda 表达式。

于 2012-11-20T01:33:52.143 回答
1

将代码更改为:

class WilxList {
private:    
    static bool testSorter(const Test & x1, const Test & x2);
}

std::sort(sortedTests.begin(), sortedTests.end(), WilxList ::testSorter); //ERROR

非静态testSorter采用一个隐式this指针,该指针不兼容用作 in 中的谓词std::sort,它采用两个参数。

您也可以声明testSorter为全局函数,都可以。

于 2012-11-20T01:41:42.190 回答
0

你要

 std::sort(sortedTests.begin(), sortedTests.end(), std::mem_fun(&WilxList ::testSorter));

或类似的东西。在这里查看http://www.cplusplus.com/reference/std/functional/mem_fun/

于 2012-11-20T01:36:54.410 回答