Неправильное использование нестатического члена данных при использовании шаблонов
У меня есть следующий фрагмент кода, который реализует двоичное дерево поиска с шаблонами:
#include<iostream>
using namespace std;
template<typename T>
class Node{
public:
T data;
Node<T> *left;
Node<T> *right;
Node<T> *parent;
Node(T input_data=NULL){
data=input_data;
left=NULL;
right=NULL;
parent =NULL;
}
};
template<typename T>
class BinarySearchTree{
private:
long n;
Node<T> *root;
public:
BinarySearchTree(Node<T> *input_root=NULL, long input_size=0){
n=input_size;
root=input_root;
}
void insert(Node<T> *p=root, T data){
Node<T> *par=NULL;
while(p!=NULL){
par=p;
if(data <= p->data)
p=p->left;
else
p=p->right;
}
Node<T> *z=new Node<T>(data);
if(root==NULL){
root=z;
n=1;
return;
}
z->parent=par;
if(data<=par->data)
par->left=z;
else
par->right=z;
n+=1;
}
void inorder(Node<T> *p=root){
if(p){
inorder(p->left);
cout<<p->data<<" ";
inorder(p->right);
}
}
int main(){
BinarySearchTree<int> *t=new BinarySearchTree<int>();
t->insert(5);
t->insert(15);
t->insert(3);
t->insert(14);
t->insert(25);
t->insert(10);
t->inorder();
}
В строке 27 есть ошибка компиляции (то есть Node *root;), которая гласит: "Недопустимое использование элемента не статических данных" BinarySearchTree::root "". Я думаю, что это связано с аргументами по умолчанию, которые я включил в функции 'insert' и 'inorder', потому что я не получаю сообщение об ошибке при удалении аргумента по умолчанию 'root'.
У меня вопрос, что происходит и как мне обойти это? Я хотел бы сохранить аргумент по умолчанию root, если это возможно.
Если это имеет значение, я использую программное обеспечение под названием " Quincy 2005" в Windows 8.1 для компиляции (по определенным причинам).
2 ответа
Значением по умолчанию должен быть литерал, а не имя переменной.
Кроме того, аргументы со значениями по умолчанию должны быть последними в списке аргументов.
Скорее используйте:
void insert(Node<T> *p, T data) { ... }
// overload with only one argument
void insert(T data)
{
insert(root, data)
}
В строке, такой как
void insert( Node<T>* p = root ,T data ) {...}
Есть 2 ошибки.
Во-первых, вы можете использовать значение по умолчанию только для аргументов, начиная с последнего параметра и обратно. Поскольку вы не указали для данных значение по умолчанию, это ошибка (параметры переупорядочения решения должны быть первыми).
Во-вторых, ценность root
является членом this
и нет this
в пункте декларации. Решение, если вам нужно по умолчанию, используйте nullptr
по умолчанию и внутри вашего функционального теста для nullptr
и если так, то используйте root
вместо.