我收到一些奇怪的错误,我想要一些帮助。这是代码:
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()':函数调用缺少参数列表;使用'&amp; Pred :: operator()'创建指向成员的指针
我也得到:
c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ utility(85):错误C2440:'initializing':无法从'int'转换为'Item&amp;'
还有一些"*my_path*\microsoft visual studio 11.0\vc\include\utility(83)" complaining about std::pair
答案 0 :(得分:1)
这里有很多问题。
pair
无法获取引用模板参数。您需要使用std::reference_wrapper
。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;
}