4

stl プライオリティ キューから最小ヒープを作成しています。これが私が使用している私のクラスです。

class Plane
{
  private :
    int id ;
    int fuel ;
 public:
    Plane():id(0), fuel(0){}
    Plane(const int _id, const int _fuel):id(_id), fuel(_fuel) {}

    bool operator > (const Plane &obj)
    {
        return ( this->fuel > obj.fuel ? true : false ) ;
    }

};

主に、このようにオブジェクトをインスタンス化します。

 priority_queue<Plane*, vector<Plane*>, Plane> pq1 ;
 pq1.push(new Plane(0, 0)) ;

理解できないエラーが発生しxutilityています。

d:\microsoft visual studio 10.0\vc\include\xutility(674): エラー C2064: 用語が 2 つの引数を取る関数に評価されません

その解決策への助けをいただければ幸いです。

4

2 に答える 2

12

std::greaterポインターの使用をやめると (単純な構造ではやり過ぎです)、ヘッダーから使用できますfunctional

std::priority_queue<Plane, std::vector<Plane>, std::greater<Plane> > pq1;
pq1.push(Plane(0, 0));

Plane現在、あなたは比較タイプとしてフィードしています。比較型は関数オブジェクトの型である必要があるため、これは機能しません。つまりoperator()、比較を行う が必要です。Planeにはそのようなメンバーはありません (この目的のためだけに追加するのはお勧めできません)。

std::greaterあなたの観点から実装された適切なメソッドがありますoperator>。ただし、ポインターでは機能しません。これは、ポインター比較 (メモリ アドレスに基づく) を使用するためです。

ところで、比較関数はより簡潔に次のように表現できることに注意してください。

bool operator>(const Plane &other)
{
    return fuel > other.fuel;
}
于 2012-12-07T15:08:31.313 に答える
7

3 番目のテンプレート パラメーターは、 teo を受け取るバイナリ ファンクターでなければなりませんPlane*。あなたのPlaneクラスはそれを提供しません。

フォームの何かが必要です

struct CompPlanePtrs
{
  bool operator()(const Plane* lhs, const Plane* rhs) const {
    return lhs->fuel > rhs->fuel ;
  }
};
于 2012-12-07T15:03:34.897 に答える