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

C++ 使用';typename';关键字将非类型视为依赖上下文中的类型,c++,visual-c++,avl-tree,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_

我在我的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\u ptr AVL::rightRotate(std::unique\u ptr&y){
std::unique_ptr x=std::move(y->left);
std::unique_ptr T2=std::move(x->right);
//轮换
x->右=标准::移动(y);
x->右->左=标准::移动(T2);
//更新高度
/x->right->height=std::max(高度(x->right->left),高度(x->right->right))+1;
x->height=std::max(高度(x->左)、高度(x->右))+1;
返回std::move(x);
}
最初我认为我可以按照类中的方式声明它,即std::unique\u ptr rightRotate(std::unique\u ptr&y)

有人知道问题出在哪里吗?此外,我不确定是否应该发布更多的类代码,尽量使其最小化

由于类型
AVL
取决于模板参数
T
,如果要引用其成员类型之一,则需要
typename
。因此,您必须键入
std::unique\u ptr
,而不是
std::unique\u ptr

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

template <class T>
auto AVL<T>::rightRotate(std::unique_ptr<TreeNode>& y) -> std::unique_ptr<TreeNode> { /* ... */ }
模板
auto AVL::rightRotate(std::unique\u ptr&y)->std::unique\u ptr{/*…*/}

使用尾部返回类型将强制在返回类型中的
TreeNode
AVL
范围内查找,就像在参数类型中一样。

很好,非常感谢!