在模板中重载 < 运算符

Overloading < operator in template

我正在编写二叉树 class 模板。当我添加一个新节点时,我会检查新节点是小于还是大于当前节点。

我在 class 类型 (Object) 中重载了 < 和 > 运算符并且工作正常,但是模板没有调用重载运算符,而是使用编译器生成的。

object.cc - Comparison between objects works outside the template

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* 然后去掉这段代码中的 *s(以及相应的其他地方)但仍然记得不要使用>==!=等。它们都可以通过<的结果推断出来(a是"equal to"ba<bb<a 都是 false)

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

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

想想这段代码在做什么!