c++ - 使用模板时无效使用非静态数据成员

标签 c++ templates default-arguments

我截取了以下代码,它使用模板实现了二叉搜索树:

#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/

相关文章:

c++ - 删除从嵌套包中找到的第一个指定类型

c++ - 使用默认参数转发引用?

C++ 调用显式模板构造函数

c++ - 关于类模板成员的显式特化的困惑

c++ - 只传递第二个模板参数的方法

c++ - 如何用不同数量的默认参数包装一个函数,使其只有一个参数?

c++ - 使用 Dlib 进行地标检测

java - 学习用于 Android 游戏开发的 OpenGL ES

c++ - 类型定义和转换

c++ - 将对象数组传递给同一类 C++