2

エラーが発生します:

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

i&kをキャストすると、次のようにintなります。

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_iftheobject(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;
};

これにより、コンストラクターはij保存されたオブジェクトを構築し、それが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 に答える