C++ 使用 Template 時 沒有定義operator

==============程式碼如下============== struct MyStruct { int value; } ; // struct MyStruct template <class CType> bool compare( CType a, CType b ){ return a > b; } // bool compare() int main(){ MyStruct a, b; compare( 1, 2 ); compare( a, b ); } // main()... show more ==============程式碼如下==============

struct MyStruct {
int value;
} ; // struct MyStruct

template <class CType>
bool compare( CType a, CType b ){
return a > b;
} // bool compare()

int main(){
MyStruct a, b;
compare( 1, 2 );
compare( a, b );
} // main()
==============程式碼如上==============

我使用compare( 1, 2 )的時候沒有問題

但是我使用compare( a, b )的時候

compiler 說MyStruct 沒有定義 operator >


我知道為什麼錯誤,也知道幫MyStruct overload operator 就可解決了

可是我想知道有沒有方法可以不用overload operator

我希望能夠比較a和b的address 來處理


簡單描述一下我的問題 :

template <class CType>
bool compare( CType a, CType b ){
return a > b;
} // bool compare()

有沒有辦法在處理 int, float, double 等基本型態時,以一般方式比較
( int a = 1; int b = 2; ---->> return a > b; )

而在處理 Object 等非基本型態時,以其位址比較
( MyStruct a, b; ------>> return &a > &b
Update: =====================================

感謝【帕拉提斯】大的回答,不過我希望的是像意見中novus 大所說的

不希望逐一定義 operator

還是謝謝,下次我會問的清楚些~
Update 2: ============================
To N大 : 其實我打意見原本也想要希望N大能夠回答一下,不過打完我的問題就忘記了.....


traits 的部分大至上看得懂,不過就N大說的 如果 MyStruct 中使用者有自定義 operator > 的話

似乎還是會單純比較位址,這並不是我想要的。( 我發問時沒想到這個狀況... )


另外 SFINAE 的部分 我實在看不懂,我不是很喜歡寫我看不懂的程式碼..而且N大也不建議

再者我也覺得用這個好像不是很親切.......還有我用的環境是VC 2008...所以不考慮使用這個...
Update 3: 最後看到萬用的...這似乎比較符合我這個新手的水準...

不過還是有些問題,我對 namespace 比較不熟,不過這個我應該可以解決....跳過

想請問的是

這個看起來比實作一個 operator> 比較位址的 CRTP base class

方便而且實用(?)多了

不知道這樣做有什麼缺點,用CRTP會比這個好的地方
Update 4: ==========================

To 【帕拉提斯】:

感謝帕大的回答

帕大的補充回答跟N大的最後一個萬用的方式好像一樣...

不過N大說了

"所有帶有明確型別的 operator> 的優先順序都會比這個高,只有在找不到更好的匹配情況下才會使用這個版本"

所以似乎不用再然後逐一特化 PoD type。

而且逐一特化好像也挺麻煩的....

感謝帕大回答。可能的話我希望程式碼能夠簡單一點,親切一點。
3 answers 3