Операторы сравнения перегрузки для шаблонного класса - PullRequest
0 голосов
/ 25 октября 2010

У меня проблемы с перегрузкой операторов сравнения для сравнения двух 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 будет иметь значение 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;
}

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Не вводите определение 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...
}
1 голос
/ 25 октября 2010

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

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

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

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

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

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

Приветствия и hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...