我有以下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
。