尝试在树中搜索特定节点,我需要在找到它时返回指向节点的指针。节点是一个名为BudgetEnvelope
的派生类类型,我得到的错误是:
无法使用类型为
BudgetEnvelope
的左值初始化Node<BudgetEnvelope>
类型的返回对象
template <class T>
T* Tree<T>::find( Node<T> * ptr, T value){
if(ptr != NULL){
if(ptr->value == value){
return ptr; <------error is on this line
}
else{
if(value < ptr->value){
return find(ptr->left, value);
}
else{
return find(ptr->right, value);
}
}
}
else{
return NULL;
}
}
我的理解是,由于节点与我返回的指针的类型相同,它应该可以工作。我该如何解决这个问题?
编辑:更多信息。
当我将返回类型更改为Node<T>*
时,我使用此方法的文件给了我另一个错误。
void EnvelopeBox::deposit(int id, double amount){
BudgetEnvelope searchKey = *new BudgetEnvelope(id, "searchKey");
BudgetEnvelope* keyPtr = envelopes.find(searchKey); <----same error
keyPtr->deposit(amount);
}
deposit
类是在BudgetEnvelope
类中定义的,而不是Node
,所以如果我将keyPtr
更改为同一类型Node<T>*
,我可以不能访问deposit
方法。
答案 0 :(得分:2)
我认为您要返回Node<T>*
而不是T*
,因为ptr
的类型为Node<T>*
e.g。
Node<T>* Tree<T>::find( Node<T> * ptr, T value)
修改强>
根据您提供的新信息,您需要做的是转换
BudgetEnvelope* keyPtr = envelopes.find(searchKey);
到
Node<BudgetEnvelope>* keyPtr = envelopes.find(searchKey);
然后访问内部数据,执行以下操作:
BudgetEnvelope myValue = keyPtr->Value;
myValue.deposit(amount)
您需要做的是访问节点内的数据。
或者,您可以从ptr->Value
功能返回find
。
答案 1 :(得分:2)
ptr
是指向类型Node<T>
的指针,该函数返回指向类型T
的指针。类型T
和Node<T>
不同。
如果要返回T*
,则应返回Node
类中的任何方法,返回指向Node
中包含的值的指针。否则,我认为这就是你想要的,改变签名T* Tree<T>::find( Node<T> * ptr, T value)
以返回Node<T>*
,正如贾斯汀建议的那样。