在使用模板时无效地使用非静态数据成员

Invalid use of non-static data member while using templates

本文关键字:静态 数据成员 无效      更新时间:2023-10-16

我剪了下面的代码,它实现了一个带有模板的二叉搜索树:

#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"的软件来编译(出于某些原因)。

默认值必须是文字,而不是变量名。

另外,带有默认值的参数必须排在参数列表的最后。

,而使用:

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个错误

首先,您只能对从最后一个形参开始并向后的参数使用默认值。因为你没有给data一个默认值,这是一个错误(解决方案重新排序参数,没有默认值的必须先出现)。

其次,值rootthis的成员,在声明点没有this。解决方案,如果你需要一个默认值,使用 nullptr 作为默认值,并在你的功能测试中为 nullptr ,如果是这样,使用root代替。