我剪切了以下代码,它实现了带有模板的二进制搜索树:
#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的默认参数。
如果重要,我在Windows 8.1上使用名为“Quincy 2005”的软件进行编译(出于某些原因)。
答案 0 :(得分:0)
在诸如
之类的行中void insert( Node<T>* p = root ,T data ) {...}
有2个错误。
首先,您只能对从最后一个参数开始向后的参数使用默认值。 由于您没有为数据提供默认值,因此这是一个错误(解决方案重新排序参数,那些没有默认值的参数必须先出现)。
其次,值root
是this
的成员,并且在声明时没有this
。
解决方案如果您需要默认值,则使用 nullptr
作为默认值并在 nullptr
的功能测试中使用,如果是,请使用root
代替。