2013-10-02 84 views
1

我有三個模板類型(基本上與一個多構件的一對)的模板類和我不能得到比較超負荷工作:C++:模板類與比較運算符重載

頭:

template<typename FirstType, typename SecondType, typename ThirdType> 
class Triple 
{ 
public: 
    Triple(FirstType f, SecondType s, ThirdType t) : var1(f), var2(s), var3(t) 
    {} 
... 
private: 
    FirstType var1; 
    SecondType var2; 
    ThirdType var3; 
}; 


template<typename F1, typename S1, typename T1, typename F2, typename S2, typename T2> 
bool operator==(const Triple<F1,S1,T1>& one, const Triple<F2,S2,T2>& other) 
{ 
    return true; //just for testing 
} 


template<typename F1, typename S1, typename T1, typename F2, typename S2, typename T2> 
bool testFunc(const Triple<F1,S1,T1>& one, const Triple<F2,S2,T2>& other) 
{ 
    return true; //just for testing 
} 

主:

Triple<int, int, int> asdf(1, 1, 2); 
Triple<int, int, int> qwer(1, 21, 2); 
cout << asfd == qwer;   //doesn't work 
cout << testFunc(asfd, qwer); //works 

我得到==操作符以下錯誤信息:

binary '==' : no operator found which takes a right-hand operand of type 'Triple<FirstType,SecondType,ThirdType>' 

爲什麼testFunc有效,但運算符重載不?請注意,我想包括比較兩種不同類型的三元組的可能性,因爲有人可能想要比較整數與雙打。我也嘗試在類內部實現相同的結果。

+0

BTW,你應該嘗試使用'的std :: tuple',而不是爲它創建自己的類。 – Nawaz

回答

5

<<具有比==更高的優先級。這意味着你的表達式解析爲

(cout << asdf) == qwer; 

只需加括號解決這個

cout << (asdf == qwer); 
+0

+1。哦,那是對的。 – Nawaz

+1

傻了。 如果編譯器說「沒有找到將ostream作爲左側操作數並將Triple作爲右側操作數的操作符」,我將立即知道。我責怪編譯器。 :) – SnowFatal

+0

@SnowFatal當我看到流式傳輸時,總是我首先想到的('<<' and '>>')和其他運算符混合在一起,並且它不會編譯 – SirGuy