2012-12-02 205 views
0

我的專家,再次在網上練習時,我遇到了另一個問題。這是關於函數模板的。我能夠創建模板,但我不知道如何重載適當的操作符。請指教。超載運營商<

問題

函數模板largestOfTree返回最大的相同參數化類型的3個元素。函數模板可以應用於什麼類?寫一個類trainEngine與字段爲名稱,型號,質量。過載相應的運算符,這樣最大的三個函數模板可以應用到三個trainEngine對象。

到目前爲止?

template<class T> 
bool largestOfThree(T t1, T t2, T t3){ 
    if(t1<t2&&t2<t3){ 
    return true; 
    }else{ 
    return false; 
    } 
} 

trainEngine

class trainEngine { 
private: 
string name; 
string model; 
string mass; 
public: 
friend bool operator<(trainEngine const& lhs) { 
if (lhs.name<lhs.model&&lhs.model<lhs.mass){ 
return true; 
} 

};

+0

要哪些類的功能可以應用在很大程度上取決於功能的實現,你沒有顯示。 – juanchopanza

+0

@juanchopanza我想我可以表明我們可以使用任何類的模板。 –

+0

你在問「功能模板應用到什麼類」,我說「這主要取決於函數的實現」。如果該函數只是返回一個'T()',那麼它將適用於所有具有默認構造函數和複製構造函數的類。如果調用't1.foo()',那麼你會有額外的約束。 – juanchopanza

回答

3

A friend operator<將成爲非成員,因此應該是二元的。而且,你忘記了返回類型。你可能想要:

friend bool operator<(trainEngine const& lhs, trainEngine const& rhs) { 
    // implementation 
} 

這將去你的operator<聲明當前的地方。

Here是運營商重載的慣用簽名列表,以及對評論中提到的juanchopanza更詳細的解釋。請注意,如果非成員運算符標記爲朋友,則可以在類體內定義它們。 (他們仍然非成員函數,如果你做到這一點。)

+0

+1。 LHS和RHS之間的對稱性最好有一個非成員二元運算符而不是成員。 – juanchopanza

+0

@AntonGolov比我如何編碼模板部分。是否正確接受3個參數 –

+0

@ user1571494該模板只是查找哪個「t1」,「t2」和「t3」是最大的。例如,如果't1

0

如果你超載運營商「<」,你也應該重載運算符「>

,你必須寫返回類型布爾也。

friend bool operator<(trainEngine const& obj1, trainEngine const& obj2) 

事實上,這是慣例,大多數代碼喜歡的<使用過>但更普遍,超載總是一整套相關的運營商;在你的情況下,這也可能是==,!=,<=>=

+0

你的比較函數是一元的,所以它不會工作得很好。 – juanchopanza

+0

@juanchopanza:是的,thnx,更新 –

0

讓我注意,目前您的實施只取決於右側(你稱之爲lhs!)。這當然不是你想要的。

我想你想是這樣的:

bool operator<(trainEngine const& rhs) { 
    if(name!=rhs.name) 
    return(name<rhs.name); 
    if(model!=rhs.model) 
    return (model<rhs.model); 
    return (mass<rhs.mass); 
} 

朋友版本

//within the class 
friend bool operator<(trainEngine const& lhs, trainEngine const& rhs); 

//outside the class 
bool operator<(trainEngine const& lhs, trainEngine const& rhs) { 
    if(lhs.name!=rhs.name) 
    return(lhs.name<rhs.name); 
    if(lhs.model!=rhs.model) 
    return (lhs.model<rhs.model); 
    return (lhs.mass<rhs.mass); 
}