Ошибка компиляции c ++ в шаблоне priority_queue

0

У меня есть следующий класс, который используется в priority_queue:

class People
{
public  :
    People(int iage,char *n)
    {
        age = iage ;
        strcpy(name,n) ;
    }
    bool operator >(People& m)
    {
        return( (this->age) >  m.getage() ) ;
    }
    int getage() {return age;}
    char* getname() {return name;}
private :
    int age ;
    char name[28] ;
} ;

Priority_queue выглядит так:

template <typename T>
class Compare{
public:
    bool operator()(const pair<T,int> &lhs,const pair<T,int> &rhs) const{
       //return ((lhs.first) > (rhs.first)) ;
       T t1 = lhs.first ;
       T t2 = rhs.first ;
       return (t1 > t2) ;
   }
} ;

template <typename T>
vector<T> merge_arrays(const vector<vector<T> > &S)
{
    priority_queue<pair<T,int>,vector<pair<T,int> >,Compare<T> > min_heap;
    ......
}

В main():

int main()
{
    vector<People> v1 ;
    vector<People> v2 ;
    vector<People> v3 ;
    vector<vector<People> > vx ;
    char namex[3][20] = {"People1","People2","People3"} ;

    for(int idx=0;idx<30;idx++)
    {
        if( (idx%3)==0)
            v1.emplace_back(idx,namex[0]) ;
        else if( (idx%3)==1)
            v2.emplace_back(idx,namex[1]) ;
        else
            v3.emplace_back(idx,namex[2]) ;
    }//for

    vx.push_back(v1) ;
    vx.push_back(v2) ;
    vx.push_back(v3) ;

    vector<People> v = merge_arrays<People>(vx) ;
    ....
}

Вопрос заключается в Compare, исходный источник:

template <typename T>
class Compare{
public:
    bool operator()(const pair<T,int> &lhs,const pair<T,int> &rhs) const{
       return ((lhs.first) > (rhs.first)) ;
   }
} ;

Это будет скомпилирована ошибка, поэтому я меняю этот источник на следующее и работает!

template <typename T>
class Compare{
public:
    bool operator()(const pair<T,int> &lhs,const pair<T,int> &rhs) const{
       T t1 = lhs.first ;
       T t2 = rhs.first ;
       return (t1 > t2) ;
   }
} ;

Несмотря на то, что проблема исчезла, мне все же хотелось бы узнать, могу ли я сделать что-то еще для этого теста, чтобы не было необходимости T t1 = lhs.first; и T t2 = rhs.first; и все еще делают эту функцию работы !!!!

Любые комментарии, предложения приветствуются!

  • 0
    случайная идея ... что если вы приведете lhs.first и rhs.first к (T) lhs.first и (T) rhs.first..и сделаете что-то вроде return (T) lhs.first> (T) rhs.first ? просто догадка без гарантий :)
  • 0
    @ Джош, спасибо, добавь (T) все еще получаю ошибку компиляции!
Показать ещё 4 комментария
Теги:
templates

1 ответ

2
Лучший ответ

Ваш оператор не является const и не является его параметром. Оба должны быть.

Обратите внимание на тип объектов, передаваемых вашему компаратору:

const std::pair<T,int>& lhs, const std::pair<T,int>& rhs

Ваш lhs.first > rhs.first действителен только в том случае, если ваш operator > также const. Объявите оператора следующим образом:

bool operator >(const People& m) const
{
    return age > m.age ;
}

Также обратите внимание, что ваши другие члены также должны быть const, поскольку они не предназначены для изменения объекта каким-либо образом. Объявление их как const гарантирует, что вы случайно не изменяете объект при их вызове. То есть:

int getage() const { return age; }
const char* getname() const { return name; }

Удачи.

  • 0
    спасибо большое, ваш совет работает отлично !! Вы действительно очень помогли !!!!!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню