C++二叉搜索树模板从函数返回节点



我有以下BinaryTree类,其中包括一个名为Node的私有类(除了这个问题需要的内容之外,我省略了所有内容(:

template<typename T>
class BinaryTree{
private:
template<typename NT>
class Node{
public:
Node<NT>* left;
Node<NT>* right;
NT item;
};
public:
Node<T> Find(T itemToFind);
};

这是相当标准的。我正在尝试实现返回Node对象的Node FindMax()函数,但无法弄清楚如何定义它。例如,我(错误地(假设这就足够了:

template<typename T>
Node<T> BinaryTree<T>::Find(T itemToFind){ // -------> error line
//...do something....
}

但我得到一个错误说:No template named Node.我尝试了各种其他组合都无济于事。如果找到,我不想返回bool,我想返回Node本身。

您需要添加作用域运算符::,因为Node类是BinaryTree类的一部分:

template<typename T>
BinaryTree<T>::Node<T> BinaryTree<T>::Find(T itemToFind) {
//...do something....
}

C++14 引入了返回类型auto因此以下内容也可以使用:

template<typename T>
auto BinaryTree<T>::Find(T itemToFind) {
//...do something....
}

此时,Node类不在范围内。 你需要做这样的事情:

template<typename T>
BinaryTree<T>::Node<T> BinaryTree<T>::Find(T itemToFind) { 
//...do something....
}

这是 C++11 尾随返回类型的动机之一,它允许您缩短返回类型。 IIRC,成员函数的尾随返回类型在类的范围内进行评估。

template<typename T>
BinaryTree<T>::Find(T itemToFind) -> Node<T> { 
//...do something....
}

顺便问一下,你真的希望 Node 类有一个独立于BinaryTree模板参数的模板参数吗? 也就是说,您可能希望消除第二个模板参数NT

最新更新