2012-11-20 66 views
0

我有一个类,它基本上看起来像这样(我删除了不必要的代码):排序结构的C++向量类

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

那么你的问题是什么? – Jay

+0

问题是,我如何摆脱错误,但我已经得到了答案。 – user1047833

回答

5

testSorter是一个非静态成员函数WilxList这是造成困难。要使用非静态成员函数的函数指针相对较难更困难,并且不可能在需要像sort算法那样的免费(或静态成员)函数的情况下使用。

修复此问题的一个选项testSorter移动到结构本身中,并将其重命名为operator<。这可以让你做像x1<x2这样的东西,你可以调用排序只是std::sort(sortedTests.begin(), sortedTests.end());这是假设该函数实际上代表<操作,如果它没有,它可能会令人困惑,并会更加漂亮,使其成为一个静态成员函数。无论哪种情况,错误都会消失。

+0

谢谢!我将它变成了静态成员函数,正是我需要的。对于需要帮助或参考的人:http://www.learncpp.com/cpp-tutorial/812-static-member-functions/ – user1047833

1

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

你可以用下面的方法解决这个问题:第一种方法是使比较函数static,另一个是使其成为独立函数,第三种方法是使用C++ 11 lambda表达式。

+0

谢谢!我把它变成了静态成员函数! – user1047833

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为全局函数,或者没关系。