为啥我在将 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【问题讨论】:
【参考方案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)
...
编译器需要该关键字才能知道node
是BST
中的嵌套类型。
【讨论】:
请注意,额外的typename
是必需的,因为在这种情况下,node
是dependent name,因为BST<key_t>
依赖于模板参数key_t
。编译器需要一些额外的帮助来解决依赖名称存在的一些歧义。以上是关于为啥我在将 unique_ptr 返回给模板类的对象的函数定义时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章
模板类的树,其中 chilldren 是 std::array of std::unique_ptr