c ++ binarytree重载

时间:2012-05-21 12:11:39

标签: visual-c++

我创建了一个包含一个字符和一个字符串的stuct

 struct M2E
 { char english;
 string morse;}

通过使用给出的代码,我创建了一个M2E的二叉树,它是bintree 但我想按字符串莫尔斯顺序对这些M2E进行排序(“*”小于“ - ”) 所以我在struct M2E中做了一个重载器

 bool operator == (M2E& other) const
{
    return morse.compare(other.morse);
}

但是我在编译时会不断给出以下错误消息

no match for "operator ==" in ((binNode<M2E>*)this)->binNode<M2E>::nodeData == dataItem
note:candidates are :bool M2E::operator==(M2E&) const

我用于二进制树的代码是bintree.h:

  template <typename dataType> class bintree
{  
  private:
  binNode<dataType> *root;
  int numItems;

  void insert(const dataType& newData) 
  {
     // insert the newData into the tree

     if (root == NULL) 
     {
        root = new binNode<dataType>(newData);
     } 
     else 
     {
        root->insert(root, newData);
     }
     numItems++;
  }

用于二进制节点的代码是binnode.h:

  template <typename dataType> class binNode 
 {
 private:
  // private data ====================================
  dataType nodeData;
  binNode<dataType> *left, *right;

        void insert(binNode<dataType>* &root, const dataType& dataItem) 
  {
     if (nodeData == dataItem) 
     {
        throw std::invalid_argument("dataItem already in tree");
     }

     if (dataItem < nodeData) 
     {
        if (left == NULL) 
        {
           left = new binNode(dataItem);
        } 
        else 
        {
           left->insert(left, dataItem);
        }
     } 
     else 
     {
        if (right == NULL) 
        {
           right = new binNode(dataItem);
        } 
        else 
        {
           right->insert(right, dataItem);
        }
     }
     rebalance(root);
  }

thx for help

1 个答案:

答案 0 :(得分:1)

问题是您在const datatype dataItem中使用了insert(),但operator==采用了非常量M2E参数。

您需要将operator==参数类型指定为const

bool operator == (const M2E& other) const {
  //...
}

请记住const是契约:函数承诺不会更改其参数的值。因此insert()做出了这个承诺,但operator==没有,所以insert()无法让该运算符按原样调用它。通过将const添加到operator==的参数类型,您可以使operator==做出相同的承诺,因此insert()可以将其称为