2011-11-03 97 views
0

這段代碼有問題嗎?std :: binary_search的自定義比較函數

bool Spellcheck::smart_comp(string value, string key){ 
    return true; 
} 

void func(){ 
    std::string aprox_key = "hello"; 
    if(std::binary_search(this->words.begin(), this->words.end(), aprox_key, smart_comp)){ 
     std::cout << "Found" << std::endl; 
    } 
} 

我試圖寫我自己的比較功能對的binarySearch比較字符串

我收到以下錯誤:

xyz.cpp:40:85: error: no matching function for call to ‘binary_search(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, std::string&, <unresolved overloaded function type>)’ 
xyz.cpp:40:85: note: candidates are: 
/usr/include/c++/4.6/bits/stl_algo.h:2665:5: note: template<class _FIter, class _Tp> bool std::binary_search(_FIter, _FIter, const _Tp&) 
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note: bool std::binary_search(_FIter, _FIter, const _Tp&, _Compare) [with _FIter = __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >, _Tp = std::basic_string<char>, _Compare = bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)] 
/usr/include/c++/4.6/bits/stl_algo.h:2698:5: note: no known conversion for argument 4 from ‘<unresolved overloaded function type>’ to ‘bool (Spellcheck::*)(std::basic_string<char>, std::basic_string<char>)’ 

任何幫助表示讚賞...

回答

4

Is there any problem with this code?

bool Spellcheck::smart_comp(string const value, string const key){ 
    return true; 
} 

除了總是返回true?是的,基本問題是成員函數有一個隱式參數this,所以簽名與預期謂詞不匹配。你應該做這個功能static甚至是一個免費的功能(如果需要,可以編輯friend)。此外,您每次都複製strings,如果您通過const引用來避免不必要的副本,那麼這將是最好的。

如果謂詞的實際結果取決於Spellcheck對象的狀態,你將不得不那個狀態綁定到成員函數以創建此時,相應的簽名函數對象:

std::binary_search(
    this->words.begin(), this->words.end() 
    , std::bind(&Spellcheck::smart_comp, this) 
); 
+0

你的意思是說,我必須把這個功能放在課外? – rda3mon

+1

@Ringo:的確如果它不依賴於對象的內容。否則,你需要一個函數對象來承載這種狀態。 –

+0

非常感謝... – rda3mon

2

您正在嘗試傳遞非靜態成員函數,該函數不能轉換爲所需的二進制函數(由於具有三個實際參數)。

嘗試聲明您的smart_comp函數static。 (當然,你不能引用實例成員;如果需要有狀態,你必須寫一個完整的仿函數)。

1

假設this->words的類型是std::vector<std::string>funcSpellcheck一員,你可以圍繞宣稱smart_compstatic工作。但我會考慮你的班級設計。

+0

你爲什麼認爲我的課堂設計有缺陷?那麼我同意在另一點 – rda3mon

+0

@Ringo:因爲沒有明顯的理由把比較邏輯放在除有狀態仿函數以外的任何類中。 – ildjarn

+0

好的。從錯誤中學習.. – rda3mon

相關問題