为啥我在将 unique_ptr 返回给模板类的对象的函数定义时出现错误?

Posted

技术标签:

【中文标题】为啥我在将 unique_ptr 返回给模板类的对象的函数定义时出现错误?【英文标题】:Why do I get error on the definition of a function that returns a unique_ptr to a an object of a template class?为什么我在将 unique_ptr 返回给模板类的对象的函数定义时出现错误? 【发布时间】:2020-05-08 23:18:49 【问题描述】:

这很好用:

template <typename key_t>
class BST
    struct node
        node(const key_t mKey) : key(mKey)

        key_t key;
        std::unique_ptr<node> left;
        std::unique_ptr<node> right;
    ;

    //stuff

    //this function definition works fine here
    std::unique_ptr<node>& _find_next_successor(std::unique_ptr<node> &curr)
        if(curr->left == nullptr)
        return curr;

        return _find_next_successor(curr->left);
    


;

但是当我尝试在类外实现 _find_next_successor 时,出现错误:

template <typename key_t>
class BST
    struct node
        node(const key_t mKey) : key(mKey)

        key_t key;
        std::unique_ptr<node> left;
        std::unique_ptr<node> right;
    ;

    //stuff

    //definition
    std::unique_ptr<node>& _find_next_successor(std::unique_ptr<node> &);

;

//implementation, I get error by the compiler
template <typename key_t>
std::unique_ptr<BST<key_t>::node> &
BST<key_t>::_find_next_successor(std::unique_ptr<node> &curr)
    if(curr->left == nullptr)
        return curr;

    return _find_next_successor(curr->left);

C:\Users\m\Documents\TreeNode20.cpp:65:33: 错误: 'template class std::unique_ptr' 模板参数列表中参数 1 的类型/值不匹配 std::unique_ptr::node> BST::_find_next_successor(std::unique_ptr &curr) ^ C:\Users\m\Documents\TreeNode20.cpp:65:33:错误:预期类型,得到 'BST::node' C:\Users\m\Documents\TreeNode20.cpp:65:33:错误:模板参数 2 无效 C:\Users\m\Documents\TreeNode20.cpp:65:35:错误:'int BST::_find_next_successor(std::unique_ptr::node>&)' 的原型不匹配'BST' 类中的任何 std::unique_ptr::node> BST::_find_next_successor(std::unique_ptr &curr) ^ C:\Users\marco\Documents\TreeNode20.cpp:22:25:错误:候选是:std::unique_ptr::node>& BST::_find_next_successor(std::unique_ptr::node>&) std::unique_ptr& _find_next_successor(std::unique_ptr &); ^ 编译结果... -------- - 错误:5 - 警告:0 - 编译时间:0.70s

【问题讨论】:

【参考方案1】:

您在函数定义中unique_ptr 的模板参数中缺少关键字typename

template <typename key_t>
std::unique_ptr<typename BST<key_t>::node> & //missing keyword
BST<key_t>::_find_next_successor(std::unique_ptr<node> &curr)
...

编译器需要该关键字才能知道nodeBST 中的嵌套类型。

【讨论】:

请注意,额外的typename 是必需的,因为在这种情况下,node 是dependent name,因为BST&lt;key_t&gt; 依赖于模板参数key_t。编译器需要一些额外的帮助来解决依赖名称存在的一些歧义。

以上是关于为啥我在将 unique_ptr 返回给模板类的对象的函数定义时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章

模板类的树,其中 chilldren 是 std::array of std::unique_ptr

返回带有抽象类的 unique_ptr

为啥我不能将 new 创建的 &client 对象分配给 unique_ptr

为啥 unique_ptr<T> 不能从 T* 构造?

为啥在将唯一指针插入无序映射时 C++ 会给我一个错误?

在将 std::string 分配给模板参数期间编译时出错