我尝试在C ++模板中编写一个简单的二叉树。在main()的第二行,我想声明
Node<string,Node,int>
第二个Node是错误的,因为它是一个类模板,必须实例化为
Node<string,Node<string,int,int>,int>
但随着树的增长,类型会增长。我怎样才能使用第一个声明?谢谢!
我的C ++编译器是g ++ 4.8.1,支持C ++ 11。
#include <iostream>
#include <string>
using namespace std;
template<typename T, typename Tl, typename Tr>
struct Node {
// tree node
T top;
Tl left;
Tr right;
Node (const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
top(t), left(tl), right(tr){}
};
int main() {
Node <string,int,int> n1 (string("+"), 1, 2);
// !!!wrong , should be Node<string,Node<string,int,int>,int>
Node<string,Node,int> n2 (string("*"), n1, 4);
}
更新
我添加了指向struct的指针。如何让它变得更好?谢谢!
#include <iostream>
#include <string>
using namespace std;
template<typename T=string, typename Tl=int, typename Tr=int>
struct Node {
// tree node
struct Node<T,Tl,Tr>* p_left;
struct Node<T,Tl,Tr>* p_right;
T top;
Tl left;
Tr right;
Node (struct Node<T,Tl,Tr>* pl=nullptr, struct Node<T,Tl,Tr>* pr=nullptr,
const T& t=T(),const Tl& tl=Tl(),const Tr& tr=Tr()):
p_left(pl), p_right(pr), top(t), left(tl), right(tr){}
};
using tnode = struct Node<>;
int main() {
tnode n1 (nullptr,nullptr,string("+"), 1, 2);
tnode n2 (&n1, nullptr,string("*"), 0,0);
}
更新2 ,添加智能指针。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
template<typename T=string, typename Tc=int>
class Node {
public:
Node (shared_ptr<Node> pl=nullptr,
shared_ptr<Node> pr=nullptr,
const T& t=T(),
const Tc& tl=Tc(),
const Tc& tr=Tc()):
p_left(pl), p_right(pr), v_top(t), v_left(tl), v_right(tr){}
~Node() {
cout<<"Calling destructor"<<endl;
}
private:
shared_ptr<Node> p_left;
shared_ptr<Node> p_right;
T v_top;
Tc v_left,v_right;
};
using tNode = Node<>;
using spNode = shared_ptr<tNode>;
spNode create_tree() {
spNode n0 = make_shared<tNode>(nullptr,nullptr,string("*"), 7, 3);
spNode n1 = make_shared<tNode>(nullptr,n0,string("+"), 5, 6);
spNode n2 = make_shared<tNode>(n1, nullptr,string("+"), 3,4);
return n2;
}
int main() {
spNode n2 = create_tree();
}
答案 0 :(得分:0)
获取template<typename>class NodeMaker
,将父Node
类型传递给两个子参数。
写template<typename T>using Same=T;
和templatestruct fixed {templateusing type = X;}`。
现在,
Node<string, Same, fixed<int>::template type>
制作你想要的类型。
作为一个问题,此类型的大小无限:您需要一种让Node
内的Node
消失的方法。使用std::unique_ptr<>
来抓住你的左右孩子?