Не могу получить доступ / установить значения нулевой структуры - PullRequest
0 голосов
/ 31 марта 2019

Я делаю класс шаблона двоичного дерева, и хотя эта конкретная ошибка во время выполнения никогда не возникала при инициализации BST с помощью int, я не справился с этим при инициализации BST со строками. Ошибка возникает в отмеченной строке.

#ifndef BST_H
#define BST_H

#include "BSTInterface.h"

template <typename T>
class BST : public BSTInterface<T>
{
public:
    BST()
    {
        root = new Node;
        root = NULL;
    }
    bool addNode(const T& newVal, Node *start)
    {
        start->data = newVal; // ERROR HERE
        return true;
    }
private:
    struct Node
    {
        T data;
        Node *left;
        Node *right;
    };
    Node *root;
};
#endif

Я попытался установить для каждого из значений root значение null, но я получаю эту ошибку сборки:

BST.h(18): error C2593: 'operator =' is 
ambiguous

В строке 18 я устанавливаю start-> data на ноль. Установка start-> left и start-> right to null не приводит к ошибкам сборки.

Я должен иметь возможность установить их на null, а не на какое-либо произвольное значение, чтобы другой код (который я не могу изменять) работал. Любая помощь будет высоко ценится.

Редактировать: Включены побочные эффекты сверхминимализации.

#include "BST.h"

int main(int argc, char * argv[])
{
    BST<std::string> myBST;
    myBST.addNode("e");
}

Дополнительная функция в BST, которая вызывается из main:

bool addNode(const T& newVal)
{
    return addNode(newVal, root);
}

Редактировать 2: код для BSTInterface

//**** YOU MAY NOT MODIFY THIS DOCUMENT ****/
#ifndef BST_INTERFACE_H
#define BST_INTERFACE_H
#include <string>

/** A binary tree node with data, left and right child pointers */
template<typename T>
class BSTInterface
{
public:
    BSTInterface(void) {}
    virtual ~BSTInterface(void) {}

    /** Return true if node added to BST, else false */
    virtual bool addNode(const T&) = 0;

    /** Return true if node removed from BST, else false */
    virtual bool removeNode(const T&) = 0;

    /** Return true if BST cleared of all nodes, else false */
    virtual bool clearTree() = 0;

    /** Return a level order traversal of a BST as a string */
    virtual std::string toString() const = 0;
};
#endif  // BST_INTERFACE_H

1 Ответ

0 голосов
/ 31 марта 2019

Я использовал приведенный ниже код, чтобы попытаться воспроизвести ошибку:

#include <string>
#include <stdexcept>

template<typename T>
class BSTInterface
{
public:
    BSTInterface(void) {}
    virtual ~BSTInterface(void) {}

    /** Return true if node added to BST, else false */
    virtual bool addNode(const T&) = 0;

    /** Return true if node removed from BST, else false */
    virtual bool removeNode(const T&) = 0;

    /** Return true if BST cleared of all nodes, else false */
    virtual bool clearTree() = 0;

    /** Return a level order traversal of a BST as a string */
    virtual std::string toString() const = 0;
};

template <typename T>
class BST : public BSTInterface<T>
{
   private:
    struct Node
    {
        T data;
        Node *left;
        Node *right;
    };
    Node *root;
   public:
    BST()
    {
        root = new Node;
    }
    bool addNode(const T& newVal, Node *start)
    {
        start->data = newVal; // ERROR HERE
        return true;
    }
    bool removeNode(const T&) override {
        throw std::runtime_error("Not implemented yet"); 
    }
    bool clearTree() override {
        throw std::runtime_error("Not implemented yet"); 
    }
    std::string toString() const override {
        throw std::runtime_error("Not implemented yet"); 
    }

    bool addNode(const T& val) override {
        return addNode(val, root); 
    }

};

int main(int argc, char * argv[])
{
    BST<std::string> myBST;
    myBST.addNode("e");
}

И я не смог воспроизвести ошибку (она скомпилирована нормально).Не могли бы вы предоставить полный код?

...