2011-02-19 22 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

kvp1およびkvp2は、KeyValuePair<char, int>オブジェクトへのポインタです。彼ら自身はKeyValuePair<char, int>オブジェクトではありません。

*kvp1 < *kvp2は、オーバーロードされたoperator<を呼び出します。ポインタの組み込みoperator<が使用されるため、operator<に2つのポインタ型をオーバーロードすることはできません。

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

関連する問題