operator()缺少参数列表

时间:2013-02-08 11:12:03

标签: c++

我收到一些奇怪的错误,我想要一些帮助。这是代码:

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

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

  1. pair无法获取引用模板参数。您需要使用std::reference_wrapper
  2. 请勿使用已弃用的活页夹。他们在引用参数方面存在问题。
  3. 不要继承pair。它没有虚拟析构函数。
  4. 如果你真的想使用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;
    }