Неправильное использование нестатического члена данных при использовании шаблонов

У меня есть следующий фрагмент кода, который реализует двоичное дерево поиска с шаблонами:

#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 для компиляции (по определенным причинам).

2 ответа

Решение

Значением по умолчанию должен быть литерал, а не имя переменной.

Кроме того, аргументы со значениями по умолчанию должны быть последними в списке аргументов.

Скорее используйте:

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 вместо.

Другие вопросы по тегам