0

奇妙なエラーが発生しています。助けてください。コードは次のとおりです。

Obs.h:

class Obs;

struct Try : public std::pair<Item&, std::pair<int, int> > {
    Item& item() const;
    int dx() const;
    int dy() const;

    Try( Item& i, int _dx, int _dy );
};

struct Pred : public std::binary_function<Obs, Try, bool> {
    bool operator() (Obs& o, Try& m) const;
};

class Obs {

    Rect position;

public:

    Obs (Rect dimensions);
    bool Allows (Item i, int dx, int dy) const;

};

Obs.cpp:

Try::Try (Item& i, int _dx, int _dy) {
    first = i;
    second.first = _dx;
    second.second = _dy;
}


bool Obs::Allows (Item i, int dx, int dy) const {
    //
}

bool Pred::operator()(Obs& o, Try& m) const {
    return !o.Allows( m.item(), m.dx(), m.dy() );
}


Item& Try::item() const {
    return first;
}

int Try::dx() const {
    return second.first;
}

int Try::dy() const {
    return second.second;
}

ObsHolder.h:

class ObsHolder {

    std::list< Obs* > list;

public:

    void AddObstacle (Obs* obs);
    bool CanMove (Item& i, int dx, int dy);

};

ObsHolder.cpp:

bool ObsHolder::CanMove (Item& i, int dx, int dy) {

    return std::find_if( list.begin(), list.end(), std::bind2nd(Pred::operator(), Try(i, dx, dy) )) == list.end();

}

私が得る主なエラーは次のとおりです。

'Pred::operator ()': 関数呼び出しに引数リストがありません。「&Pred::operator ()」を使用して、メンバーへのポインターを作成します

私も得る:

c:\program files (x86)\microsoft visual studio 11.0\vc\include\utility(85): エラー C2440: '初期化中': 'int' から 'Item &' に変換できません

そして、いくつかの下"*my_path*\microsoft visual studio 11.0\vc\include\utility(83)" complaining about std::pair

4

1 に答える 1

1

ここにはたくさんの問題があります。

  1. pair参照テンプレート引数を取ることはできません。を使用する必要がありますstd::reference_wrapper
  2. 非推奨のバインダーは使用しないでください。参照引数に問題があります。
  3. から継承しないでくださいpair。仮想デストラクタはありません。

本当に使用したい場合bind2nd:引数としてメンバー関数ポインターを取りませんが、呼び出し可能なオブジェクトの値を取ります。

最新の C++ での完全な例。私はまだ使用しません std::list<Obs*>が、メモリ自体を管理するものです。

#include <utility>
#include <functional>
#include <tuple>
#include <list>
#include <algorithm>

class Obs;
class Item {};

typedef std::tuple<std::reference_wrapper<Item>, int, int> Try;

Item& item(Try& t) { return std::get<0>(t); }
const Item& item(const Try& t) { return std::get<0>(t); }
int dx(const Try& t) { return std::get<1>(t); }
int dy(const Try& t) { return std::get<1>(t); }
Try make_try(Item& i, int x, int y) { return std::make_tuple(std::ref(i), x, y); }

// missing
struct Rect {}; 

class Obs {
  Rect position;
public:

  Obs (Rect dimensions) : position(dimensions) {}
  bool Allows (Item i, int dx, int dy) const { return false; /* quite compiler */ }
};

struct Pred {
  bool operator() (Obs& o, const Try& m) const {
    return !o.Allows( item(m), dx(m), dy(m) );
  }
};


class ObsHolder {
  std::list< Obs* > list;
public:

  void AddObstacle (Obs* obs);
  bool CanMove (Item& i, int dx, int dy) {
    Pred p;
    auto x = make_try(i, dx, dy);
    return std::find_if(list.begin(), list.end(), 
                        [=](Obs* o) { return p(*o, x); }) == list.end();
  }
};

int main()
{

  return 0;
}
于 2013-02-08T11:17:46.617 に答える