重载<模板中的运算符

时间:2015-12-30 18:43:12

标签: c++ templates overloading operator-keyword

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

我超载<和>类类型(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);
    }
  }

1 个答案:

答案 0 :(得分:3)

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

如果您有充分理由这样做,请与以下内容进行比较:

*par_T < *(par_node->value)

*(par_node->value) < *par_T

请注意*的使用,并注意我切换了侧面而不是误用>

如果您没有充分理由让节点包含T*,那么请删除此代码中的*(以及相应的其他地方),但仍记得不要使用>==!=等等。<的结果可以推断出a b是&#34;等于&#34; {{ 1}}当a<bb<a都是false

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

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

考虑一下代码在做什么!