2010-10-25 2 views
0

У меня возникают проблемы в перегрузке операторов сравнения для сравнения двух pair-структуру таким образом:операторы сравнения перегрузки для шаблонного класса

typedef pair<string, unsigned int> INDEX; 
bool operator>(INDEX &v1, INDEX &v2) 
{ 
    if(v1.second == v2.second) //if integer parts are equal 
    { 
     //string that comes earlier in the dictionary should be larger 
     return v1.first < v2.first; 
    } 
    return v1.second > v2.second; 
} 

Фактическое сравнение происходит в this->element(hole/2) < this->element(hole) внутри fixUp(CBTNODE hole), функцию-член класса BinaryHeap, который является производным классом CompleteBinaryTree. T будет создан как тип INDEX, который является typedef ed как pair<string, unsigned int>.

Другими словами, сравнение между двумя парами: («a.txt», 42)> («b.txt», 42) должно возвращать значение true.

Я попытался перегружать operator> вне объявления класса в двух разных направлениях, но ни один из них работал:

  1. bool operator>(INDEX &v1, INDEX &v2);
  2. bool operator>(BinaryHeap<T> &v1, BinaryHeap<T> &v2);

Любая помощь будет высоко ценится!

Z.Zen

Вот заявление:

typedef int CBTNODE; 

template <typename T> 
class CompleteBinaryTree { 
public: 
    //Initializes an empty binary tree 
    CompleteBinaryTree(int initialSize = 10); 

    //Destructor 
    ~CompleteBinaryTree(); 

    //Returns the element of the CBT pointed to by node. Behavior is undefined 
    //if node does not exist. 
    T element(CBTNODE node); 

protected: 
    T *data; 
    int numElts, maxElts; 
}; 

typedef pair<string, unsigned int> INDEX; 

template <typename T> 
class BinaryHeap : public CompleteBinaryTree<T> 
{ 
    public: 
     //Maintain heap property with bottom up heapify method. 
     void fixUp(CBTNODE hole); 
}; 
bool operator>(INDEX &v1, INDEX &v2); 

Реализация:

template <typename T> 
T CompleteBinaryTree<T>::element(CBTNODE node) { 
    assert(node >= 0); 
    assert(node < numElts); 
    return data[node]; 
} 

template <typename T> 
void BinaryHeap<T>::fixUp(CBTNODE hole) 
{ 
    T tmp = this->element(hole);  
    while(hole > 0 && this->element(hole/2) < tmp) 
    { 
     //do stuff 
    } 
} 

bool operator>(INDEX &v1, INDEX &v2) 
{ 
    if(v1.second == v2.second) //if two have same relevance 
    { 
     return v1.first < v2.first; 
    } 
    return v1.second > v2.second; 
} 
+0

какая ошибка вы получаете и на какой линии? – Chubsdad

+0

Есть ли настоящая необходимость в определении «bool operator» (INDEX & v1, INDEX &v2);). Не имеет пары классов с операторами сравнения? – Chubsdad

+0

Он скомпилирован, но не сделал того, что он должен был делать. Я создал тестовый пример, делает сравнение: пара <'a', 42>> пара <'b', 42>, и она возвращает false, которая должна возвращать true согласно моему определению.Первый элемент пары - строка C++, а второй - int. –

ответ

1

Временные, например, в результате element FUNC, не может быть связана с ссылкой на не const, например, формальные аргументы вашего operator>.

Объявить его таким образом:

bool operator>(INDEX const& v1, INDEX const& v2) 

Однако реализация, что вы представите не кажется правильным для operator>.

А пока я нахожусь, то, что вы хотите, это действительно operator<, потому что это тот, который требуется стандартными алгоритмами. Возможно, в сочетании с operator== (потому что неэффективно синтезировать его от operator<). С этими двумя отношениями можно проверить относительно эффективно.

Btw., Если вы прекратите использовать ВСЕ имена UPPERCASE для чего-либо еще, а затем макросы (см. FAQ), то вы можете избежать случайного столкновения имен с макросами.

Приветствия & НТН,

+0

большое вам спасибо! Отлично работает. Я фактически реализовал все операторы сравнения, но я только показал один в своем вопросе ради простоты. –

+0

Хм. Это не поразило меня о «const &», поскольку OP упомянул, что код строит и работает нормально. – Chubsdad

1

Не INDEX определение типа во, быть явным:.

template<class F, class S> 
struct Index { 
    std::pair<F, S> Value; 
    Index(const std::pair<F, S>& pValue) 
    : Value(pValue) {} 
}; 

template<class F, class S> 
bool operator<(const Index<F, S>& pLeft, const Index<F, S>& pRight) { 
    // your implementation... 
} 
Смежные вопросы