5

質問があります。

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)) です

コードの何が問題になっていますか?

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

よろしく..

4

2 に答える 2

4

カスタムコンパレータとしてメンバー関数を渡しているようです。それを作る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

于 2012-12-17T22:13:17.223 に答える
2

の宣言nodeComp()が間違っています。標準ライブラリの規則に従いたい場合は、通常のメンバー関数ではなく、フリー関数または静的関数のいずれかである必要があります。通常は、プライベート クラス メンバーにアクセスできるように、フレンドとしてマークされた無料の関数にすることをお勧めします。あなたが宣言した関数は、すべての非静的メンバー関数によって実行される「hidden this」パラメータを実行するため、xutility.h で期待されるコンパレータ関数を作成しません。

また、 の実装をnodeComp()考えると、オブジェクトのデータではなく、パラメーターとして渡されるオブジェクトのデータで動作するため、通常のメンバー関数にする理由はまったくありません。

あなたの生活とあなたの後にコードを維持しなければならない他の人の生活の両方を簡素化するために、標準ライブラリの規則に従い、nodeComp() を次のコードに置き換え、AstarPlanlama のクラス宣言内でオペレーターをフレンドとして宣言します。

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

また、生のポインターを標準ライブラリ コンテナーに配置することは、一般的に悪い考えです。これは、あらゆる種類の興味深い有効期間管理の問題につながる可能性があるためです。絶対にポインターを使用する必要がある場合は、ブースト ポインター コンテナーのように設計されたコンテナーを使用するかstd::shared_ptr、生のポインターを処理する代わりにオブジェクトをラップすることをお勧めします。

于 2012-12-17T22:13:42.230 に答える