Перегрузка реляционного оператора в шаблонном классе (C ++) - PullRequest
1 голос
/ 20 февраля 2011

Я создаю класс KeyValuePair и столкнулся с некоторыми проблемами при перегрузке реляционных операторов.Насколько я понимаю, это необходимо для использования функций сортировки std (я пытаюсь сортировать по значениям)

Вот заголовок:

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, и она никогда не активируется.</p>

Есть идеи?Заранее спасибо.

1 Ответ

5 голосов
/ 20 февраля 2011

kvp1 и kvp2 являются указателями на 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
...