【问题标题】:Overloading < operator in template在模板中重载 < 运算符
【发布时间】:2016-04-04 18:26:37
【问题描述】:

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

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

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

【问题讨论】:

  • 仔细检查您是在比较实例,而不是指针,即
  • 提供您在其中比较实例的代码段
  • 你有什么问题?
  • 您正在比较指针,您不能重载运算符
  • 我应该如何比较这个? ¿ *(par_node->value)

标签: c++ templates overloading operator-keyword


【解决方案1】:

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

如果您有充分的理由这样做,请比较:

*par_T &lt; *(par_node-&gt;value)

*(par_node-&gt;value) &lt; *par_T

注意* 的使用,注意我换了边,而不是误用&gt;

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

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

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

想想这段代码在做什么!

【讨论】:

  • 它工作正常。没有注意到我在比较指针。我使用 T* 是因为我觉得使用指针更舒服,这样函数就不会创建节点的新副本
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2012-02-07
相关资源
最近更新 更多