【问题标题】:C++ Binary Search Tree template return Node from functionC++ 二叉搜索树模板从函数返回节点
【发布时间】:2020-01-26 22:10:24
【问题描述】:

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

【问题讨论】:

    标签: c++ templates binary-search-tree


    【解决方案1】:

    您需要添加范围运算符::,因为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....
    }
    

    【讨论】:

    • 技术上你可以使用auto,如果你在 C++11 中足够努力的话,但在这种情况下使用实际类型会更容易。
    【解决方案2】:

    此时,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

    【讨论】:

    • 我没有想到那个。我假设外部类是否有模板参数,为了使内部类通用,我还需要添加一个模板。我通过删除节点的模板参数更改了我的实现,并将T 用作item 的类型。感谢您的指出!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多