使用模板时无效使用非静态数据成员
Invalid use of non-static data member while using templates
我截取了以下代码,它使用模板实现了二叉搜索树:
#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;)出现编译错误,内容为:"Invalid use of non-static data member 'BinarySearchTree::root'"。我认为这与我在函数 'insert' 和 'inorder' 中包含的默认参数有关,因为当我删除默认参数 'root' 时我没有收到错误.
我的问题是,发生了什么,我该如何解决?如果可能的话,我想保留 root 的默认参数。
如果重要的话,我正在 Windows 8.1 上使用名为“Quincy 2005”的软件进行编译(出于某些原因)。
默认值必须是文字,而不是变量名。
此外,具有默认值的参数必须在参数列表中排在最后。
而是使用:
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
代替。
我截取了以下代码,它使用模板实现了二叉搜索树:
#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;)出现编译错误,内容为:"Invalid use of non-static data member 'BinarySearchTree::root'"。我认为这与我在函数 'insert' 和 'inorder' 中包含的默认参数有关,因为当我删除默认参数 'root' 时我没有收到错误.
我的问题是,发生了什么,我该如何解决?如果可能的话,我想保留 root 的默认参数。
如果重要的话,我正在 Windows 8.1 上使用名为“Quincy 2005”的软件进行编译(出于某些原因)。
默认值必须是文字,而不是变量名。
此外,具有默认值的参数必须在参数列表中排在最后。
而是使用:
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
代替。