c++ - 在模板中重载 < 运算符

标签 c++ templates overloading operator-keyword

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

我在类类型 (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 在此代码中(以及相应的其他地方)但仍然记得不要使用 > , == , !=等等,都可以通过<的结果推断出来(当 ab 都是 a<b 时,b<a “等于” false )

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

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

想想这段代码在做什么!

关于c++ - 在模板中重载 < 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34535292/

相关文章:

azure - 如何安排部署ARM模板?

java - 编译器根据什么标准选择重载方法之一

c++ - 在启动时填充全局静态数组

C++ 类可以包含一组类中的一个,这些类都继承自一个公共(public)类

c++ - 列表初始化器和可变参数构造函数

c++ - 具有派生模板类和继承成员变量的语法难题

c# - 是否有 C# 方法重载参数排序约定?

c# - CA 2225 同时重载长运算符

c++ - LPTSTR 开头的奇怪字符? C++

c++ - 结合 std::string 和 std::vector<char>