使用'typename'关键字将非类型视为依赖上下文中的类型

时间:2018-10-11 01:59:02

标签: c++ visual-c++ avl-tree

我在这部分代码的标题中描述了我的AVL树类中的错误:

template <class T>
std::unique_ptr<AVL<T>::TreeNode> AVL<T>::rightRotate(std::unique_ptr<TreeNode>& y) {
    std::unique_ptr<TreeNode> x = std::move(y->left);
    std::unique_ptr<TreeNode> T2 = std::move(x->right);

    // Perform rotation
    x->right = std::move(y);
    x->right->left = std::move(T2);

    // Update heights
    / x->right->height = std::max(height(x->right->left), height(x->right->right)) + 1;
    x->height = std::max(height(x->left), height(x->right)) + 1;

    return std::move(x);
}

最初,我认为我可以像在课程中一样声明它,即std::unique_ptr<TreeNode> rightRotate(std::unique_ptr<TreeNode>& y);

有人知道是什么问题吗?另外,我不确定是否应该发布更多的类代码,以尽量减少此类代码。

1 个答案:

答案 0 :(得分:3)

由于类型AVL<T>取决于模板参数T,因此,如果要引用其成员类型之一,则需要typename。因此,您必须输入std::unique_ptr<AVL<T>::TreeNode>而不是std::unique_ptr<typename AVL<T>::TreeNode>

避开此问题的一种方法是使用尾随返回类型:

template <class T>
auto AVL<T>::rightRotate(std::unique_ptr<TreeNode>& y) -> std::unique_ptr<TreeNode> { /* ... */ }

使用尾随返回类型将强制返回类型中的TreeNodeAVL<T>范围内进行查找,就像在参数类型中一样。