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であり、アルゴリズムのようなフリー(または静的メンバー)関数を期待する場合には使用できません。

これを修正する1つのオプションtestSorterは、構造体自体に移動して、名前をに変更することoperator<です。これにより、次のようなことができるようx1<x2になり、sortをそのまま呼び出すことができます。std::sort(sortedTests.begin(), sortedTests.end());これは、関数が実際に操作を表すと想定しています<。そうでない場合は、混乱する可能性があり、静的メンバー関数にする方が適切です。どちらの場合もエラーはなくなります。

于 2012-11-20T01:33:50.303 に答える
1

問題は、コンパレータ関数がメンバー関数であり、std::sort予期しないことです。

これはいくつかの方法で解決できます。1つはコンパレータ関数を作成する方法static、もう1つは独立関数にする方法、3つ目はC++11ラムダ式を使用する方法です。

于 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

Non-staticは、の述語として使用されている互換性のないtestSorter暗黙のポインターを取ります。これは、2つの引数を取ります。thisstd::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 に答える