2013-01-17 71 views
1

,我發現了錯誤:C++ find_if找不到謂語

no matching function for call to ‘findByPosition::findByPosition(std::vector<int>::size_type&, std::vector<int>::size_type&)’ 

當我投i & kint我得到:

no matching function for call to ‘findByPosition::findByPosition(int, int)’ 

我不知道什麼是根本我的謂詞有問題。我重載()運營商需要:

struct findByPosition 
{ 
    const Node needle; 
    findByPosition(const Node& sought) : needle(sought) {} 
    bool operator()(int i,int j) const 
    { 
     return ((needle.i == i) && (needle.j == j)); 

    } 
}; 

SparseMatrix& SparseMatrix::operator*=(const SparseMatrix &other) 
{ 
    SparseMatrix SparseMatrixResult(_numRow, other._numCol); 
    vector<Node>::iterator rowMulti, colMulti; 

    if(_numCol != other._numRow) 
    { 
     // error multiplying 
    } 

    for(std::vector<int>::size_type i = 0; i != (unsigned int)_numRow; i++) { 

      for(std::vector<int>::size_type j = 0; j != (unsigned int)_numCol; j++) { 

       for(std::vector<int>::size_type k = 0; k != (unsigned int)_numCol; k++) 
       { 
        rowMulti = find_if(_matrix.begin(), _matrix.end(), findByPosition(i,k)); 
       } 
      } 
     } 

    *this = SparseMatrixResult; 
    return *this; 
} 

_matrix的類型爲:

vector<Node> _matrix; 
+0

你怎麼用rowMulti如果您發現該元素?我只看到幾個循環,但沒有做其他任何事情? – billz

回答

4

當你調用findByPosition(i,k)你實際上試圖調用構造函數,而不是operator()

你需要定義一個構造函數,然後你可以在該行使用生成對象find_if然後將調用theobject(i,j)內部調用operator()

你可以看到這個從錯誤

no matching function for call to ‘findByPosition::findByPosition(int, int)’

它試圖找到構造

要正確使用謂詞,您需要實際翻轉操作符和構造函數。構造函數應該採用i,j,因爲它對函數的所有調用都是常見的,操作符應該參考const Node&,因爲它是矩陣的元素類型,並且是調用函子的數據類型。

struct findByPosition 
{ 
    findByPosition(int _i, int _j) : i(_i), j(_j) {} 
    bool operator()(const Node& needle) const 
    { 
     return ((needle.i == i) && (needle.j == j)); 

    } 
private: 
    int i,j; 
}; 

這樣,構造函數將構造一個對象與ij保存,然後將傳遞到您的find_if功能。

3

Lambda是簡單的搜索一個更好的選擇,如果你使用C++11

rowMulti = find_if(_matrix.begin(), _matrix.end(), 
        [=](const Node& n){return n.i==i && n.j == k; });