过载<模板中的运算符

Overloading < operator in template

本文关键字:运算符 lt 过载      更新时间:2023-10-16

我正在编程一个二进制树类模板。当我添加一个新节点时,我会检查新节点是否小于或大于当前节点。

我过载<和>运算符,并且工作正常,但模板不调用重载运算符,而是使用编译器生成的。

object.cc-在模板之外工作的对象之间的比较

bool Object::operator<(const Object& par_other) const 
{
  printf("n    <");
  return id_ < par_other.id_;  //assume that you compare the record based on a
}

第1版:添加了一些请求的代码。寻求帮助:)

struct Node {
    T* value;
    Node* left;
    Node* right;
  };
template <class T> 
void BinaryTree<T>::add(T* par_T, Node* par_node) {
  if (par_node == nullptr) {
    par_node->left = nullptr;
    par_node->value = par_T;
    par_node->right = nullptr;
  } else {
    if (par_node->value == nullptr) {
      par_node->value = par_T;
    } else if (par_node->value > par_T) {
      if (!par_node->right) {
        par_node->right = createNode();
      }
      add(par_T, par_node->right);
    } else if (par_node->value < par_T) {
      if (!par_node->left) {
        par_node->left = createNode();
      }
      add(par_T, par_node->left);
    }
  }

为什么节点有T*而不是T

如果你有充分的理由这样做,那么与进行比较

*par_T < *(par_node->value)

*(par_node->value) < *par_T

注意*的使用,注意我换了边,而不是滥用>

如果你没有充分的理由让一个节点包含T*,那么去掉这个代码中的*(以及相应的其他地方),但仍然记得不要使用>==!=等。它们都可以通过<的结果推断出来(当a<bb<a都是false时,a"等于"b

你还需要解决比你要求的更多的问题。你似乎普遍对指针的性质感到困惑。代码中的一个极端示例:

  if (par_node == nullptr) {
    par_node->left = nullptr;
    par_node->value = par_T;
    par_node->right = nullptr;
  }

想想那个代码在做什么!