我截取了以下代码,它使用模板实现了二叉搜索树:
#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 上进行编译(出于某些原因)。
最佳答案
默认值必须是文字,而不是变量名。
此外,具有默认值的参数必须在参数列表中排在最后。
而是使用:
void insert(Node<T> *p, T data) { ... }
// overload with only one argument
void insert(T data)
{
insert(root, data)
}
关于c++ - 使用模板时无效使用非静态数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31455465/