模拟类的重载比较运算符

时间:2010-10-25 05:11:24

标签: c++ operator-overloading

我在重载比较运算符方面遇到麻烦,以便以这种方式比较两个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)BinaryHeapCompleteBinaryTree类的成员函数,它是T的派生类。 INDEX将被实例化为typedef类型,pair<string, unsigned int>operator>

换句话说,两对之间的比较:(“a.txt”,42)&gt; (“b.txt”,42)应该返回true。

我试图以两种不同的方式在类声明之外重载bool operator>(INDEX &v1, INDEX &v2);,但它们都没有工作:

  1. bool operator>(BinaryHeap<T> &v1, BinaryHeap<T> &v2);
  2. 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);
  3. 非常感谢任何帮助!

    Z.Zen

    以下是声明:

    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;
    }
    

    实现:

    {{1}}

2 个答案:

答案 0 :(得分:1)

临时(例如element func的结果)无法绑定到对非const的引用,例如operator>的正式参数。

如此声明:

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

但是,您提供的实施似乎不适用于operator>

虽然我喜欢它,但你想要的却是operator<,因为那是标准算法所要求的。也许与operator==结合使用(因为从operator<合成它是低效的)。有了这两个关系,可以相对有效地检查任何关系。

顺便说一句,如果您停止使用所有其他任何名称来获取宏(请参阅常见问题解答),那么您可以避免与宏无意中发生名称冲突。

干杯&amp;第h。,

答案 1 :(得分: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...
}