Можно ли создать шаблон структуры внутри шаблона класса?
У меня есть шаблон класса BinarySearchTree, внутри него я создаю структуры Node. Node должен быть такого же типа данных, как и BinarySearchTree. Но компилятору не нравится написание Node<T>* = ..., а если раскомментировать строчку перед struct Node, то будет ошибка, так как T определен выше.
#ifndef BINARYSEARCHTREE_H
#define BINARYSEARCHTREE_H
template <class T>
class BinarySearchTree {
public:
// здесь разные функции
private:
// template <class T>
struct Node {
T key_;
Node<T>* right_;
Node<T>* left_;
Node<T>* parent_;
Node(T key, Node* right = nullptr, Node * left = nullptr, Node * parent = nullptr)
: key_(key), right_(right), left_(left), parent_(parent)
{}
};
Node<T>* root_;
Node* iterativeSearchNode(const T& key) const;
};
template<class T>
BinarySearchTree<T>::Node *BinarySearchTree<T>::iterativeSearchNode(const T &key) const {
Node* current = root_;
while(current != nullptr) {
if (key > current->key_) {
current = current->right_;
} else if (key < current->key_) {
current = current->left_;
} else {
return current;
}
}
return nullptr;
}
#endif
Если же убрать <T> везде, то у меня перестает работать функция, которая находится в private и возвращает 'Node'. Выдает такую ошибку error: need 'typename' before 'BinarySearchTree<T>::Node' because 'BinarySearchTree<T>' is a dependent scope
Ответы (1 шт):
Попробуйте убрать из описания Node все эти <T>...
У вас Node, как сказать... Не слишком шаблонный, поскольку он BinarySearchTree<T>::Node, а не BinarySearchTree<T>::Node<T>.
Другое дело, если бы вам был нужен именно шаблонный Node. Тогда это бы имело вид типа
template <class U>
struct Node {
U key_;
Node* right_;
Node* left_;
Node* parent_;
Node(U key, Node* right = nullptr, Node * left = nullptr, Node * parent = nullptr)
: key_(key), right_(right), left_(left), parent_(parent)
{}
};
Node<T>* root_;
Node<int>* iroot_;
Этот Node<int>* iroot_; добавлен просто чтоб показать, что вот так вы бы могли иметь разные Node, так как он был бы реально шаблонным классом.
Update
По поводу второй проблемы из комментария... Надо указать, что это именно тип:
template<class T>
typename BinarySearchTree<T>::Node * BinarySearchTree<T>::iterativeSearchNode(const T &key) const
{
или можно
template<class T>
auto BinarySearchTree<T>::iterativeSearchNode(const T &key) const -> BinarySearchTree<T>::Node *
{