2013-11-29 101 views
0

我有下面的類似於在priority_queue使用:C++編譯錯誤在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) ; 
    .... 
} 

問題是在比較中,原始來源是:

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

@Josh,謝謝,添加(T)仍然得到編譯錯誤! – barfatchen

+0

奇怪...我一直在盯着它,我沒有其他想法lol –

回答

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可確保您在調用對象時不會意外修改對象。 I.e:

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

祝你好運。

+0

非常感謝,您的建議完美無缺!你真的幫助很多!!!!!! – barfatchen