带结构的模板

时间:2014-10-27 09:29:54

标签: c++ class templates struct binary-search-tree

我正在设计一个二进制搜索树,允许用户输入任何数据类型的值,而不仅仅是 int
为了实现这一点,我试图使用带有结构的模板。 我将结构定义如下

template <class T>
struct node
{
    struct node *left;
    T info;
    struct node *right;
}*root;

现在我尝试在名为BST(二叉搜索树)的类中使用它

template <class T>
class bst
{
    public: 
    void insert(node *,node *);
    void inorder(node *);
};

但编译器抛出错误, 'node&lt;的模板声明T&gt; * root'
我如何使用带有struct变量的模板?

3 个答案:

答案 0 :(得分:2)

您无法在模板类声明后声明root,因为无法推断出模板参数,您可以:

template <class T>
struct node
{
    struct node *left;
    T info;
    struct node *right;
};

node <int> * root;

,您应该在使用node时指定模板参数类型,例如:

template <class T>
class bst
{
    public: 
    void insert(node<T>*, node<T>*);
    void inorder(node<T>*);
};

答案 1 :(得分:1)

template <class T>
struct node
{
    // […]
} *root;

如果没有类型,则无法声明对象。 node是一个模板,而不是一个类型 - root应该具有哪种类型?
我相信你想在bst内声明它:

template <class T>
class bst
{
    node<T>* root; 
    //  ^^^
    // Supply the appropriate template arguments

    // ... or use a typedef:
    using node_type = node<T>; 

    // […]
};

答案 2 :(得分:0)

您可以使用typedef定义您的Node类型:

#include <iostream>
#include <typeinfo>

using namespace std;

template <class T>
struct node
{
    node *left;
    T info;
    node *right;

    typedef node<T>* root;
};

int main()
{
   node<int>::root root = new node<int>();
   cout<<typeid(root).name()<<endl;

   return 0;
}