调用"树:<int>:运算符==(树*&<int><int>,树*&)康斯特"没有匹配函数



我有一个通用的树实现,在编写递归树比较时遇到了这个错误。在第89行,我得到了一个错误:调用"Tree::operator==(Tree&,Tree&aamp;)const"时没有匹配的函数这是我的代码:

#include <iostream>
#include <list>
template<class T> class Tree {
public:
Tree();
Tree(const T& pNode);
virtual ~Tree();
const T& getNode();
void setNode(const T& pNode);
void addChild(Tree<T>* pChild);
const Tree<T>* getChild(int pIndex);
const std::list<Tree<T>*>* getChildren();
void printTree(const Tree<T>* pTree, int pLevel);
bool operator==(const Tree<T>& other) const;
private:
T node;
std::list<Tree<T>*>* children;
};
template<class T> Tree<T>::Tree(const T& pNode) :
node(pNode), children(nullptr) {
}
template<class T> Tree<T>::Tree() :
node(T()), children(nullptr) {
}
template<class T> Tree<T>::~Tree() {
delete children;
}
template<class T> const T& Tree<T>::getNode() {
return this->node;
}
template<class T> void Tree<T>::setNode(const T& pNode) {
this->node = pNode;
}
template<class T> void Tree<T>::addChild(Tree<T>* pChild) {
if (this->children == nullptr) {
this->children = new std::list<Tree<T>*>();
}
this->children->push_back(pChild);
}
template<class T> const Tree<T>* Tree<T>::getChild(int pIndex) {
if (true) {
}
return this->children[pIndex];
}
template<class T> void Tree<T>::printTree(const Tree<T>* pTree,
int pLevel = 0) {
for (int i = 0; i < pLevel; i++) {
std::cout << "  "; // Print 2 spaces for each level
}
std::cout << pTree->node << std::endl;
if (pTree->children != nullptr) {
for (typename std::list<Tree<T>*>::iterator i =
pTree->children->begin(); i != pTree->children->end(); i++) {
printTree(*i, pLevel + 1);
}
}
}
template<class T> const std::list<Tree<T>*>* Tree<T>::getChildren() {
return this->children;
}
template<class T> bool Tree<T>::operator==(const Tree<T>& other) const {
bool ret = false;
if (this->node == other.node) {
ret = true;
typename std::list<Tree<T>*>::iterator i, j;
for (i = this->children->begin(), j = other.children->begin();
i != this->children->end() && j != other.children->end();
i++, j++) {
ret = ret && (operator==(*i, *j)); // This is the line with the error
}
}
return ret;
}
int main(int argc, char **argv) {
Tree<int> a1(1), b1(2), c1(3);
Tree<int> a2(1), b2(2), c2(3);
a1.addChild(&b1);
a1.addChild(&c1);
a2.addChild(&b2);
a2.addChild(&c2);
bool ret = a1 == a2;
std::cout << ret << std::endl;
return 0;
}

去引用时到Tree*s的迭代返回Tree*s。

您在两个Tree*上调用Tree::operator==或空闲的operator==,但没有找到(这并不奇怪)。如果你想比较这些树,你需要再次取消引用。当你在做中缀==的时候就用它,所以**i==**j

您应该首先检查null——*i&&*j&&(**i==**j)——除非您希望两个null指针比较相等?(...)||(!*j&&!*i)或者作为一种可能的优化:(*i==*j)||(*i&&*j&&(**i==**j)),当两个指针相同时,它也跳过相等,并减少分支。

或者,如果不想比较Tree而是比较指针,请执行*i == *j

最新更新