1. ホーム
  2. c++

[解決済み] xutility.h エラー C2064: 項目が引数を 2 つ取る関数として評価されない

2022-02-02 17:43:13

質問

質問したいことがあるのですが。

AstarPlanlamaというクラスを作り、以下の2つの関数を持っています。

bool AstarPlanlama::nodeComp(const Node* lhs, const Node* rhs) 
{
   return lhs->F < rhs->F;
}

void AstarPlanlama::enKucukFliNodeBul(std::list<Node*> * OPEN)
{
    std::list<Node*>::iterator it = std::min_element(OPEN->begin(), OPEN->end(), &AstarPlanlama::nodeComp);

    OPEN->sort(&AstarPlanlama::nodeComp);   

    Q = OPEN->front();      

    OPEN->pop_front();      
}

私のコードをコンパイルすると、エラーが xutility.h ファイルを作成します。

template<class _Pr, class _Ty1, class _Ty2> inline
    bool _Debug_lt_pred(_Pr _Pred,
        _Ty1& _Left, _Ty2& _Right,
        _Dbfile_t _File, _Dbline_t _Line)
    {   // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
    if (!_Pred(_Left, _Right))
        return (false);
    else if (_Pred(_Right, _Left))
        _DEBUG_ERROR2("invalid operator<", _File, _Line);
    return (true);
    }

関数のデクラレーション

    bool nodeComp(const Node* lhs, const Node* rhs);

    void enKucukFliNodeBul(std::list<Node*> * OPEN);

エラー行は if (!_Pred(_Left, _Right))

このコードのどこが問題なのでしょうか?

ご返品ありがとうございます。

よろしくお願いします。

解決方法は?

カスタムコンパレータとしてメンバ関数を渡しているようです。 それを static を使用するか std::bind :

 std::list<Node*>::iterator it = std::min_element(OPEN->begin(), OPEN->end(),
                                       std::bind(&AstarPlanlama::nodeComp, 
                                                 this,
                                                 std::placeholders::_1,
                                                 std::placeholders::_2));

OPEN->sort(std::bind(&AstarPlanlama::nodeComp, 
                     this,
                     std::placeholders::_1,
                     std::placeholders::_2));

メンバー関数は特殊で、オブジェクトに対して呼び出す必要があります。 std::bind にバインドするために必要です。 this のポインタを使用します。