如何在c ++中的另一个模板类中使用模板类

时间:2017-10-30 03:29:24

标签: c++ templates

#include <stdio.h>

template <class T>
class BTreeNode {
public:
     BTreeNode(T d){data = d;};
private:
     T data;
};

template <class T, template<class> class Node>
class BTree {
private:
     Node<???> m_treeNodes; // I hope this type can be specified by the client, 
                            // but I don't know how to write here
     T m_data;
};


int main() {
     BTree<int, BTreeNode<int> > tree;// I don't know how to write here
     return 0;
}

那么如果我想要一个模板类有一个成员变量,该怎么办?   另一个模板类。或者如果我的设计有问题?谢谢

2 个答案:

答案 0 :(得分:1)

如果您希望客户端直接指定实例化,您可以使用类型模板参数而不是模板模板参数,例如

template <class T, class Node>
class BTree {
private:
     Node m_treeNodes;  // use the type specified by client directly
     T m_data;
};

然后

int main() {
     BTree<int, BTreeNode<int> > tree; // specify the instantiation at client
     return 0;
}

或者您可以添加另一个类型参数,并确定类模板中的实例化,这在某些情况下可能更灵活。

template <class T, template <typename> class Node, class X>
class BTree {
private:
     Node<X> m_treeNodes;  // determine the instantiation here
     T m_data;
};

然后

int main() {
     BTree<int, BTreeNode, int> tree; // specify the types at client
     return 0;
}

答案 1 :(得分:1)

除非我误解了你的意图,否则我认为你可以使用为整个T指定的类型BTree

template<class T>
class BTreeNode
{
public:
    BTreeNode() {}
    BTreeNode(T d){data = d;};

private:
    T data;
};

template<class T>
class BTree
{
public:
    BTree() {}

private:
    BTreeNode<T> m_treeNodes; // just use T ?
};


int main()
{
    BTree<int> tree;
}