2012-01-14 55 views
2

我爲自己寫了sort()的比較函數。 我這樣說的時候效果很好。使用比較函數編譯錯誤,C++排序

bool comp(string a, string b) 
{ 
    ...; 
} 

int main() 
{ 
    sort(...,...,comp); 
} 

然而,當我把這一切都在類中,說:

class Test { 

public: 
    bool comp(string a,string b) 
    { 
     ...; 
    } 
    vector <string> CustomSort(vector <string> str) { 
     sort(...,...,comp); 
    } 
}; 

有一個編譯錯誤「找不到匹配函數調用‘那種......’

爲什麼會發生這種情況

+5

你應該使用'bool comp(const string&a,const string&b)',我想。它不會影響名稱查找,但它肯定會影響運行時效率(爲每個比較中的每個參數構造並銷燬一個新字符串相對昂貴)。 – 2012-01-14 19:17:16

回答

6

X類的任何非靜態成員函數有一個額外的參數 - ?引用/指針(constX這變成this。因此,成員函數的簽名不能被sort消化。您需要使用boost::bindstd::mem_funstd::mem_fun_ref。使用C++ 11時,可以使用std::bind

std::sort(..., ..., std::bind(&Test::comp, this, _1, _2)); 

試想想它,在這種情況下,最好的解決辦法是讓你的補償功能,靜態的,因爲它並不需要this可言。在這種情況下,您的原始代碼將不會改變。

+0

非常感謝Armen :)你的回覆非常翔實。讓comp函數靜態是最簡單的方法。而且我需要了解更多信息才能理解你提到的概念。 – rliu054 2012-01-14 19:35:53