2

我收到错误:

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;
4

2 回答 2

5

当您调用时,findByPosition(i,k)您实际上是在尝试调用构造函数,而不是operator()

您需要定义一个构造函数,然后您可以在该行使用它来生成一个对象find_if然后将在theobject(i,j) 内部调用以调用operator()

您可以从错误中看到这一点

调用 'findByPosition::findByPosition(int, int)' 没有匹配的函数</p>

它试图找到构造函数

要正确使用谓词,您需要实际翻转运算符和构造函数。构造函数应该采用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;
};

这样,构造函数将构造一个带有i,j保存的对象,然后将其传递给您的find_if函数。

于 2013-01-17T04:31:18.163 回答
3

Lambda如果您使用,是简单搜索的更好选择C++11

rowMulti = find_if(_matrix.begin(), _matrix.end(),
                  [=](const Node& n){return n.i==i && n.j == k; });
于 2013-01-17T04:39:21.790 回答