0

我遇到了一些奇怪的错误,我需要一些帮助。这是代码:

观察.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): error C2440: 'initializing' : cannot convert from 'int' to '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 回答