我有一个基本上看起来像这样的类(我删除了不必要的代码):
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
答案 0 :(得分:5)
testSorter
是类WilxList
的非静态成员函数,这会导致难度。使用非静态成员函数的函数指针相对更难,并且在期望像sort
算法这样的自由(或静态成员)函数的情况下不可能使用。
解决此问题的一个选项是将testSorter
移动到结构本身并将其重命名为operator<
。这可以让你做x1<x2
这样的事情,你可以调用sort只是std::sort(sortedTests.begin(), sortedTests.end());
这假设函数实际上代表一个<
操作,如果它不是,它可能会让人感到困惑,并且会更简洁,只需使其成为静态成员函数。在任何一种情况下,错误都会消失。
答案 1 :(得分:1)
问题是比较器函数是一个成员函数,std::sort
不期望。
你可以通过多种方式解决这个问题:第一种是使比较器函数static
,另一种是使它成为一个独立的函数,第三种方法是使用C ++ 11 lambda表达
答案 2 :(得分:1)
将代码更改为:
class WilxList {
private:
static bool testSorter(const Test & x1, const Test & x2);
}
std::sort(sortedTests.begin(), sortedTests.end(), WilxList ::testSorter); //ERROR
非静态testSorter
采用隐式this
指针,该指针在std::sort
中用作谓词时不兼容,它带有两个参数。
此外,您可以将testSorter
声明为全局函数,也可以。
答案 3 :(得分:0)
你想要
std::sort(sortedTests.begin(), sortedTests.end(), std::mem_fun(&WilxList ::testSorter));
或类似的东西。点击http://www.cplusplus.com/reference/std/functional/mem_fun/