2013-02-08 82 views
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()':函數調用缺少參數列表;使用 '&潑尼鬆::運算符()' 創建一個指向成員

我也得到:

C:\ Program Files文件(x86)的\微軟的Visual Studio 11.0 \ VC \包括\實用程序(85):錯誤C2440:初始化:不能從 '詮釋' 轉換成 '項目&'

而下"*my_path*\microsoft visual studio 11.0\vc\include\utility(83)" complaining about std::pair

+1

它拼寫出來! 'use'&Pred :: operator()'創建一個指向成員的指針' – sehe

+0

@sehe即使這樣拼寫出來,這也行不通。 'bind2nd'不會將成員指針指向參數。 – pmr

+1

從編譯器錯誤中修剪諸如文件名和行號等有趣的東西,一點也不幫助。 – DevSolar

回答

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; 
}