I am getting this error in my AVL tree class as described in the title for this part of my code:
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);
}
Initially I thought I could just declare it as it is in the class, i.e. std::unique_ptr<TreeNode> rightRotate(std::unique_ptr<TreeNode>& y);
Anyone know what the problem is? Also, I am not sure if I should post more code of my class, trying to keep it minimal.
Since the type AVL<T>
depends on the template parameter T
, if you want to refer to one of its member types, you need typename
. So instead of std::unique_ptr<AVL<T>::TreeNode>
, you must type std::unique_ptr<typename AVL<T>::TreeNode>
.
A way to sidestep this issue is to use a trailing return type:
template <class T>
auto AVL<T>::rightRotate(std::unique_ptr<TreeNode>& y) -> std::unique_ptr<TreeNode> { /* ... */ }
Using the trailing return type forces the TreeNode
in the return type to be looked up in the scope of AVL<T>
just like it is in the parameter type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With