C++ 在C+;中的模板内声明另一个模板变量+;

C++ 在C+;中的模板内声明另一个模板变量+;,c++,c++11,templates,C++,C++11,Templates,我对模板编程一无所知。所以我从一些基本的模板编程开始。我制作了一个头文件BinaryTree.h,其中有一些错误。请看下面我的代码: #ifndef BINARYTREE_H_ #define BINARYTREE_H_ #include <cstdlib> #include<ctime> template<typename T> struct Node { T data; Node *lChild; Node *rChild;

我对模板编程一无所知。所以我从一些基本的模板编程开始。我制作了一个头文件BinaryTree.h,其中有一些错误。请看下面我的代码:

#ifndef BINARYTREE_H_
#define BINARYTREE_H_

#include <cstdlib>
#include<ctime>


template<typename T>
struct Node
{
    T data;
    Node *lChild;
    Node *rChild;
};

template<class T>
class BinaryTree
{
    private:
        Node<T> *root;

        void addHelper(T value, Node<T> *leaf)
        {

            if(leaf == NULL)
            {
                leaf->data = value;
                leaf->lChild = NULL;
                leaf->rChild = NULL;
            }

            else if(leaf->lChild == NULL)
            {
                leaf->lChild->data = value;
                leaf->lChild->lChild = NULL;
                leaf->lChild->rChild = NULL;
            }
            else if(leaf->rChild == NULL)
            {
                leaf->rChild->data = value;
                leaf->rChild->lChild = NULL;
                leaf->rChild->rChild = NULL;
            }
            else
            {
                srand((int)time(0));
                int i = rand() % 2;
                if(i == 0)
                {
                    addHelper(value, leaf->lChild);
                }
                else
                {
                    addHelper(value, leaf->rChild);
                }
            }
        }

        void traverseHelper(Node<T> *leaf)
        {
            if(leaf == NULL)
                return;
            traverseHelper(leaf->lChild);
            traverseHelper(leaf->rChild);
            std :: cout << leaf->data;
        }
    public:
        BinaryTree()
        {
           root = NULL;
        }

        void addNode(T value)
        {
            addHelper(value, root);
        }

        void traverseNode()
        {
            traverseHelper(root);
        }
};



#endif /* BINARYTREE_H_ */
\ifndef二进制树_
#定义二叉树_
#包括
#包括
模板
结构体类型
{
T数据;
节点*lChild;
节点*rChild;
};
模板
类二叉树
{
私人:
节点*根;
void addHelper(T值,节点*叶)
{
if(leaf==NULL)
{
叶->数据=值;
leaf->lChild=NULL;
叶->rChild=NULL;
}
else if(leaf->lChild==NULL)
{
叶->lChild->数据=值;
leaf->lChild->lChild=NULL;
leaf->lChild->rChild=NULL;
}
else if(叶->rChild==NULL)
{
leaf->rChild->data=值;
leaf->rChild->lChild=NULL;
leaf->rChild->rChild=NULL;
}
其他的
{
srand((int)时间(0));
int i=rand()%2;
如果(i==0)
{
addHelper(值,叶->lChild);
}
其他的
{
addHelper(值,叶->rChild);
}
}
}
void transversehelper(节点*叶)
{
if(leaf==NULL)
返回;
traverseHelper(叶->叶);
traverseHelper(叶->rChild);
std::cout数据;
}
公众:
二叉树()
{
root=NULL;
}
void addNode(T值)
{
addHelper(值,根);
}
void transversenode()
{
遍历帮助器(根);
}
};
#endif/*二进制树*/
现在,我的主test.cpp如下所示:

#include<iostream>
#include "BinaryTree.h"

using namespace std;

int main()
{
    BinaryTree<int> bt;
    bt.addNode(5);
    bt.addNode(6);
    bt.addNode(15);
    bt.addNode(20);
    bt.traverseNode();
    return 0;
}
#包括
#包括“BinaryTree.h”
使用名称空间std;
int main()
{
二叉树;
bt.addNode(5);
bt.addNode(6);
bt.addNode(15);
bt.addNode(20);
bt.traverseNode();
返回0;
}
但是当我试图运行代码时,它显示了一些错误

0[main]Containers 8796 cygwin_异常::open_stackdumpfile:将堆栈跟踪转储到Containers.exe.stackdump


有人能帮我找到错误的地方吗?

您试图访问一个尚未创建的元素。这就是我犯的错误。您从未创建过新的根节点。我强烈建议您查看平台上的任何调试选项。到目前为止,我犯了不止一个错误

下面是一些需要修复的步骤

首先,在
void addNode(T值)
函数中,您将需要类似的内容

void addNode(T value)
{
    if (root == NULL){
        root = new Node<T>();
        root->data = value;
        root->lChild = NULL;
        root->rChild = NULL;
    }
    else{
        addHelper(value, root);
    }
}
void addNode(T值)
{
if(root==NULL){
根=新节点();
根->数据=值;
root->lChild=NULL;
root->rChild=NULL;
}
否则{
addHelper(值,根);
}
}
或者,在构造函数中,创建一个根节点,让它为空

第二。在addhelper函数中,您需要先创建新的子对象,然后再分配它们。见下文

else if (leaf->lChild == NULL)
    {
        leaf->lChild = new Node<T>();
        leaf->lChild->data = value;
        leaf->lChild->lChild = NULL;
        leaf->lChild->rChild = NULL;
    }
else if(leaf->lChild==NULL)
{
leaf->lChild=新节点();
叶->lChild->数据=值;
leaf->lChild->lChild=NULL;
leaf->lChild->rChild=NULL;
}
然后,你需要在剩下的案件中这样做

在调试过程中,您可以看到哪些指针是空的,哪些不是空的,并且可以逐步查看代码并查看它何时中断

希望这些建议能让你走上正轨。到目前为止做得很好,代码可读性很强,很容易看到发生了什么。你只是被空指针卡住了