2015-10-31 25 views
0

Entry.hC++的std ::排序() - 無法進行排序訪問成員變量的類類型的矢量

//returns the sum of all non mega entry percentages 
float sumOfNonMegaEntryPct(vector<Number>& arg1_Numbers); 

Entry.cpp

//returns the sum of all mega entry percentages 
float Entry::sumOfMegaEntryPct(vector<MegaNumber>& arg1_MegaNumbers) 
{ 
    float sumPct = 0.00f; 
    for (MegaNumber c : megaEntry) 
    { 
     sumPct = sumPct + arg1_MegaNumbers[c.getID()].getOccurencePct(); 
    } 

    return sumPct; 
} 

Lotto.h

public: 
//compares two entries, used for sorting algorithm, sorts by nonmega number 
bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2); 

    protected: 
    vector<Numbers> numbers; 
    vector<MegaNumbers> megaNumbers; 

Lotto.cpp

#include "lotto.h" 

//sorts nonmega numbers by sum of their pct, used for sort algorithm 
bool Lotto::compareEntry_sumPct_nonMega(Entry arg1, Entry arg2) 
{ 
    bool b = arg1.sumOfNonMegaEntryPct(numbers) < arg2.sumOfNonMegaEntryPct(numbers); 
    return b; 
} 

Source.cpp

vector<Entry> copyGameEntry = game.getPlayEntry(); 
sort(copyGameEntry.begin(), copyGameEntry.end(), 
    bind(&Lotto::compareEntry_sumPct_nonMega, game)); 

這僅僅是一個部分的代碼,但我認爲這是足以讓感。編譯時,我得到的錯誤(S):

嚴重性代碼說明項目文件行錯誤C2451條件 表達型「的std :: _非受迫性」是非法彩票類別E:\程序 文件(x86)\微軟的Visual Studio 14.0 \ VC \包括\算法3133

嚴重性代碼說明項目文件行錯誤C2675一元「!」: 「的std :: _非受迫性」不定義此運算符或轉換到 類型可以接受的預定義的操作員彩票排序e:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ algorithm 3118

問:

可能是什麼問題呢?

+0

後,幾乎編譯代碼...你以爲'類{彩票'...'};'是不相關? 'sumOfNonMegaEntryPct'沒有被聲明爲成員函數。不重要的是如何在.h和.cpp文件之間劃分代碼,您可以在類定義本身中定義成員函數。 – LogicStuff

回答

6

您錯誤地使用了std::bind。您需要爲未綁定的參數使用佔位符:

using namespace std::placeholders; 
sort(copyGameEntry.begin(), copyGameEntry.end(), 
    bind(&Lotto::compareEntry_sumPct_nonMega, game, _1, _2)); 

N.B.此綁定表達式將複製game對象,因此您應該使用std::ref(game)或僅使用&game來避免不必要的副本。

或者使用lambda功能:

sort(copyGameEntry.begin(), copyGameEntry.end(), 
    [&game](Entry& l, Entry& r) { 
     return game.compareEntry_sumPct_nonMega(l, r); 
    }); 
+0

它工作,真棒! –

-1

您的錯誤bind(&Lotto::compareEntry_sumPct_nonMega, game)有關。

當您調用函數std::bind時,需要指定std::placeholders,該函數將按指定順序由調用的返回函數對象的參數替換。

你可以驗證使用以下try - catch塊:

try { 
    std::sort(copyGameEntry.begin(), copyGameEntry.end(), 
       bind(&Lotto::compareEntry_sumPct_nonMega, game) 

} catch (std::bad_function_call& e) { 
    std::cout << "ERROR: Bad function call\n"; 

} 

你的情況,你需要添加:

using namespace std::placeholders; 
auto func_obj = bind(&Lotto::compareEntry_sumPct_nonMega, game, _1, _2); 

屆時,func_obj (_1, _2)將被調用,內部由sort(),如:

func_obj(copyGameEntry[i], copyGameEntry[i+1]); 

或者,你可以嘗試使用類似:

struct Holder{ 
    bool less(const Entry& a, const Entry& b) const { 
     return a.sumOfNonMegaEntryPct(numbers) < b.sumOfNonMegaEntryPct(numbers); 
    } 
} holder; 

struct Less { 
    const Holder& holder; 
    Less(const Holder& holder) : holder(holder) {} 
    bool operator()(const Entry& a, const Entry& b) const { return holder.less(a, b); } 
}; 

std::sort(copyGameEntry.begin(), copyGameEntry.end(), Less(holder)); 
2

還有其他選擇調用的std ::排序:

#include <algorithm> 
#include <vector> 

struct X 
{ 
    int value; 
    bool operator < (const X& other) const { return value < other.value; } 
    static bool less(const X& a, const X& b) { return a.value < b.value; } 
}; 

struct Holder 
{ 
    bool less(const X& a, const X& b) const { return a.value < b.value; } 
}; 

int main() 
{ 
    Holder holder; 
    std::vector<X> values; 

    // No stateful comparison 
    std::sort(values.begin(), values.end()); 

    // No stateful comparison 
    std::sort(values.begin(), values.end(), X::less); 

    // Stateful comparison 
    struct Less { 
     const Holder& holder; 
     Less(const Holder& holder) : holder(holder) {} 
     bool operator()(const X& a, const X& b) const { return holder.less(a, b); } 
    }; 
    std::sort(values.begin(), values.end(), Less(holder)); 

    // Stateful comparison 
    std::sort(values.begin(), values.end(), [&holder](const X& a, const X& b) { 
     return holder.less(a, b); 
    }); 

    // Stateful comparison 
    using namespace std::placeholders; 
    std::sort(values.begin(), values.end(), std::bind(&Holder::less, holder, _1, _2)); 
} 

有可能的,你的情況,你缺少的std ::佔位符

+0

只有最後一行(這是正確的)很有用。其他示例不相關,因爲它們沒有顯示如何使用有狀態的比較函數(它必須是有狀態的,因爲它需要引用Lotto對象的'numbers'成員)。 –