0

我对节点类有以下实现:

template<class T> class binTree;          // forward declaration

template<class T> class Node {
friend class binTree<T>;                  // class binTree is friend

public:
    //default constructor
    Node(const T& d = T(), Node<T> *l = NULL, Node<T> *r = NULL) : data(d),
            left(l), right(r) {};

private:
    T data;
    Node<T> *left, *right;
};

我正在尝试在树的根目录中定义一个新节点,但我不断收到编译错误...

template<class T>
void binTree<T>::insert(Node<T>*& n, const T& d){
    if(n == NULL)
       root = Node<T>(d); 
}

我对const T& d = T() parameter.

4

2 回答 2

0

我不太清楚为什么在默认构造函数中对 d 变量进行默认覆盖。在我的 Tree 类的 Node 实现中,我没有默认分配。我认为问题是T()。我建议不要尝试在参数列表中进行默认分配,而是在 BMI 列表中进行。所以它看起来有点像“data(new T), left(NULL), right(NULL)”

此外,我会说我不太确定您为什么使用 T()。如果这不起作用,请发布错误代码,以便我们更好地了解发生了什么。

于 2013-10-17T14:12:52.517 回答
0

我认为您只需要在尝试定义成员之前声明 binTree 类及其成员。以下代码为我编译:

#include <cstdlib>

template<class T> class binTree;          // forward declaration

template<class T> class Node {
friend class binTree<T>;                  // class binTree is friend

public:
    //default constructor
    Node(const T& d = T(), Node<T> *l = NULL, Node<T> *r = NULL) : data(d),
            left(l), right(r) {};

private:
    T data;
    Node<T> *left, *right;
};

template <class T> class binTree
{
    public:
    binTree() { }
    void insert(Node<T>*& n, const T& d);

    private:
    Node<T> root;
};

template<class T>
void binTree<T>::insert(Node<T>*& n, const T& d){
    if(n == NULL)
       root = Node<T>(d); 
}



int main(int argc, char **argv)
{
    Node<int>* nt;
    binTree<int> btree;
    btree.insert(nt, 4);
}

话虽如此,您对数据结构的概念似乎一团糟。为什么 binTree 中的插入例程需要节点参数?

于 2013-10-17T13:53:03.437 回答