Нет конструктора по умолчанию для члена класса, который сам является объектом шаблона - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь написать простой класс для бинарного дерева поиска, который использует класс узлов с использованием шаблонов.Это мой код:

Когда я пытаюсь скомпилировать код, я получаю эту ошибку:
'Node<T>': no appropriate default constructor available'
для этой строки:
Tree() : root(0), counter(0) {}

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

#include <iostream>
#include <string>

using namespace std;

template <typename T>
class Node {
public:
    Node(const T &value) : value(value), Left(0), Right(0) {}

    ~Node() {
        if (Left != 0)
            delete Left;
        if (Right != 0)
            delete Right;
    }

    Node& getLeft() { return *Left; }

    Node& getRight() { return *Right; }

private:
    Node* Left;
    Node* Right;
    T value;
};


template <typename T>
class Tree : public Node<T> {
public:
    template<typename T>
    friend ostream& operator<<(ostream& output, const Tree<T> &t);

    Tree() : root(0), counter(0) {}

    Tree(const T &rootValue) : root(new Node<T>(rootValue)), counter(1) {}

    ~Tree() { delete root; }

    Tree& insert(const T &value) {
        Node<T> *runner = root;
        Node<T> *replacer = root;
        if (runner == 0)
            root = new Node<T>(value);
        else
        {
            while (runner != 0)
            {
                replacer = runner;
                if (value > runner->value)
                    runner = runner->Right;
                else
                    runner = runner->Left;
            }
            if (value > replacer->value)
                replacer->Right = new Node<T>(value);
            else
                replacer->Left = new Node<T>(value);
        }
        counter++;
        return *this;
    }

    bool exists(const T &value) const {
        Node<T> *runner = root;
        while (runner != 0)
        {
            if (value == runner->value)
                return true;
            if (value > runner->value)
                runner = runner->Right;
            else
                runner = runner->Left;
        }
        return false;
    }

    int size() const { return size; }

private:
    Node<T> *root;
    int counter;
};

template<typename T>
string preorderToString(const Node<T> &n) {  //Function that receives a tree and returns a string of the preorder traversal of it
    string left, middle, right;
    if (n.Left != 0)
        left = preorderToString((*n.Left)) + " ";
    middle = to_string(n.value);
    if (n.Right != 0)
        right = " " + preorderToString((*n.Right));
    return  left + middle + right;
}

template<typename T>
ostream& operator<<(ostream& output, const Tree<T> &t) //Operator overloading that uses the function 'preorderToString' to print the tree contents
{
    return output << preorderToString<T>(*(t.root));
}


int main() {
    Tree<double> test;
} 

1 Ответ

0 голосов
/ 03 января 2019

Сообщение немного вводит в заблуждение: оно не жалуется на инициализированных вами участников, но основание, которое вы не инициализировали . Поэтому он пытается использовать конструктор базы по умолчанию (Node<double>), который не существует.

Возможно, вы не хотели, чтобы Tree<T> происходило от Node<T>?

Исправляя это (и затеняя T в этой декларации друга), код компилируется .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...