приоритетная очередь пользовательского класса - PullRequest
0 голосов
/ 14 февраля 2012

Я пытаюсь добавить пользовательский объект плоскости в очередь с приоритетами:

int main( ) 

{

 std::string filename;
 cout << "Enter file name >> ";
 getline( cin, filename );

 ifstream fin;
 fin.open( filename.c_str( ) );
 if( fin.fail( ) )
 {
      cout << "Unable to open the input file" << endl;
      exit(1);

 }
priority_queue<Plane*,vector<Plane*>,greater<Plane*> > pq;
Plane * p1;
 while(fin)
 {
      fin.get( );
        fin >> *p1;
        pq.push(*p1);

 }
 Plane p;
 int size=pq.size();
 for(int i=0;i<3;i++)
 {
     p=pq.top();
     cout<<i<<" "<<p;
     pq.pop();
 }
}

Класс плоскости:

#include "plane.h"

Plane::Plane( )
{
flightNum = "Not set";
numOfPassengers = -1;
fuel = -1;
}

ostream& operator << ( ostream& os, const Plane& p )
{
os << "Flight Number: " << p.flightNum
   << "\nNumber of Passengers " << p.numOfPassengers
   << "\nRemaining fuel: " << p.fuel;

return os;
}
bool Plane::operator>(  const Plane& p2) const
{
 if(this->fuel>p2.getFuel())
 {
     return true;
  }
 else
 {
     return false;
 }
}
ifstream& operator >> ( ifstream& fin, Plane& p )
{
  fin>>p.flightNum;
  fin>>p.numOfPassengers;
  fin>>p.fuel;
}

Я получаю следующую ошибку:

 In function ‘int main()’:

welcome.cc:127: error: no matching function for call to ‘std::priority_queue<Plane*,              
std::vector<Plane*, std::allocator<Plane*> >, std::greater<Plane*> >::push(Plane&)’
/usr/lib/gcc/i686-redhat-   
linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_queue.h:509: note: candidates are:   
void std::priority_queue<_Tp, _Sequence, _Compare>::push(const typename  _Sequence::value_type&) [with _Tp = Plane*, _Sequence = std::vector<Plane*, std::allocator<Plane*> >, _Compare = std::greater<Plane*>]
welcome.cc:151: error: no match for ‘operator=’ in ‘p = pq.std::priority_queue<_Tp, _Sequence, _Compare>::top [with _Tp = Plane*, _Sequence = std::vector<Plane*, std::allocator<Plane*> >, _Compare = std::greater<Plane*>]()’

Требование программы состоит в том, что ей необходимо добавить объект плоскости в очередь с приоритетами.Приоритетом является топливо самолета.

1 Ответ

1 голос
/ 14 февраля 2012

Первая ошибка связана с тем, что вы не включили заголовочный файл cstdlib

Во-вторых, когда вы используете пользовательский класс с приоритетной очередью, как контейнер должен сравнивать ваш новый тип в этом случае?самолет класса "?Следовательно, вы должны перегрузить оператор меньше чем (<). </p>

Вы перегрузили оператор больше чем (>)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...