2013-05-03 58 views
7

我有一個向量類指針std::vector<Square*> listSquares。我想用類的其中一個屬性作爲關鍵字進行排序。這是我在做什麼std :: sort()在類指針向量上

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

但是編譯器說: 錯誤:沒有匹配函數調用「排序(標準::矢量::迭代器,性病::矢量::迭代器,<懸而未決超載功能類型>)'

我在做什麼錯在這裏?

+6

如果你可以使用C++ 11,你應該做這個拉姆達:'的std ::排序(listSquares.begin(),listSquares.end(),[](方*一,廣場* B ){return a-> getId()< b-> getId;})'。 – leftaroundabout 2013-05-03 20:28:39

+2

確保你確實需要指針而不僅僅是對象。 – chris 2013-05-03 20:30:19

+0

我無法使用C++ 11。 @chris我相信我想使用指針。 – qutab 2013-05-03 20:37:45

回答

12

爲了使用compById作爲std::sort的參數,它不應該是成員函數。這是錯誤的

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

這是更好的,

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

非常感謝。這是問題。但爲什麼我們不能將它聲明爲成員函數呢?實際上,我使用的是不同於正方形的課程。 – qutab 2013-05-03 20:47:55

+2

因爲std :: sort在調用成員函數時如何知道使用哪個對象?成員函數只能在對象上調用,但std :: sort沒有上下文來確定應該是哪個對象。大概你從某個對象內部調用了std :: sort,但是你並沒有將該對象傳遞給std :: sort。 std :: sort不知道它從哪裏被調用,它只知道傳遞給它的三個參數。 – john 2013-05-03 20:49:38

+3

+1用於心靈感應技能 – Basilevs 2013-05-04 08:10:10

3

你缺少的最重要的部分是比較函數的參數是const。另一種是返回類型。如果在聲明函數時忽略返回類型,編譯器會假定它返回int,在這種情況下這是不正確的。

當然,當您調用std::sort函數時,比較函數必須位於範圍內。

+0

即使我使用const,我也會得到相同的錯誤。在這種情況下,我還得到, gameplay.cpp:911:錯誤:將'const Square'作爲'int'參數傳遞給'int Square :: getId()'丟棄限定符[-fpermissive] – qutab 2013-05-03 20:36:39

+1

@qutab, getId()也是一個const成員函數。 – richselian 2013-05-03 20:43:54

1

您可以使用成員函數。但是您需要將其定義爲靜態成員函數,並從類中調用它,而不是類的實例。

通知static函數聲明之前和Square::在函數名稱之前進行排序。

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
}