在模板中重载 < 运算符
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"b
当a<b
和 b<a
都是 false
)
您还需要解决比您询问的更多的问题。您似乎通常对指针的性质感到困惑。您的代码中的一个极端示例:
if (par_node == nullptr) {
par_node->left = nullptr;
par_node->value = par_T;
par_node->right = nullptr;
}
想想这段代码在做什么!
我正在编写二叉树 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"b
当a<b
和 b<a
都是 false
)
您还需要解决比您询问的更多的问题。您似乎通常对指针的性质感到困惑。您的代码中的一个极端示例:
if (par_node == nullptr) {
par_node->left = nullptr;
par_node->value = par_T;
par_node->right = nullptr;
}
想想这段代码在做什么!