使用模板返回节点指针

时间:2016-05-07 08:15:45

标签: c++ templates

尝试在树中搜索特定节点,我需要在找到它时返回指向节点的指针。节点是一个名为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方法。

2 个答案:

答案 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的指针。类型TNode<T>不同。

如果要返回T*,则应返回Node类中的任何方法,返回指向Node中包含的值的指针。否则,我认为这就是你想要的,改变签名T* Tree<T>::find( Node<T> * ptr, T value)以返回Node<T>*,正如贾斯汀建议的那样。