2011-02-19 72 views
1

我正在創建一個KeyValuePair類,並且在重載關係運算符時遇到了一些麻煩。這是我的理解是,這是必要的使用STD排序功能(我想有排序基於值)模板類中的關係運算符重載(C++)

這裏是標題:

template <typename K, typename V> 
class KeyValuePair 
{ 
public: 
    //factory 
    static KeyValuePair<K,V>* newKeyValuePair(K key, V value); 
    //getters 
    const K &Key() const; 
    const V &Value() const; 
    //setter 
    V &Value(); 

    //The problem 
    bool operator<(const KeyValuePair<K,V> &rhs); 

    string toString(); 
    ~KeyValuePair(void); 
private: 
    K key; 
    V value; 
    KeyValuePair(K key, V value); 
    KeyValuePair(void); 
}; 

這裏是<函數的定義

template <typename K, typename V> 
bool KeyValuePair<K,V>::operator<(const KeyValuePair<K,V> &rhs) 
{ 
    return value < rhs.Value(); 
} 

這裏是我只是測試類的功能的主要地方。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    KeyValuePair<char,int>* kvp1 = KeyValuePair<char, int>::newKeyValuePair('A',1); 
    KeyValuePair<char,int>* kvp2 = KeyValuePair<char,int>::newKeyValuePair('B',10); 
    cout << (kvp1 < kvp2) << "\n"; 
    return 0; 
} 

我在我的KeyValuePair類<功能斷點,它不會被激活。

任何想法?提前致謝。

回答

5

kvp1kvp2是指向KeyValuePair<char, int>對象的指針。他們本身並不是KeyValuePair<char, int>的對象。

*kvp1 < *kvp2會調用您的超載operator<。對於兩種指針類型,您不能重載operator<,因爲將使用指針的內置operator<

std::pair可以用作鍵值對。無論如何,你幾乎肯定不應該動態地創建這種類型的對象:你應該儘可能避免動態分配,特別是顯式的動態分配。相反,只需使用KeyValuePair<char, int>局部變量:

KeyValuePair<char, int> kvp1('A', 1); 
KeyValuePair<char, int> kvp2('B', 10); 
std::cout << (kvp1 < kvp2) << "\n"; // calls your operator< overload 
+0

感謝您的幫助!我想將KeyValuePair作爲一個指針,用於在我將編寫的Dictionary類中進行簡單存儲。但我明白你的觀點。我也不知道std :: pair。我會研究這一點。 – Jake