C++ C++;模板递归-如何解决?
我又被模板卡住了 比如说,我想实现一个guicell系统。每个guicell可以包含多个子guicell。到目前为止,还没有树结构。在std-c++中,我会选择sthg。比如:C++ C++;模板递归-如何解决?,c++,recursion,templates,C++,Recursion,Templates,我又被模板卡住了 比如说,我想实现一个guicell系统。每个guicell可以包含多个子guicell。到目前为止,还没有树结构。在std-c++中,我会选择sthg。比如: template <typename T> class tree { public: void add (T *o) { _m_children.push_back (o); } void remove (T *o) { ... }; list<T*> _m_
template <typename T>
class tree
{
public:
void add (T *o) { _m_children.push_back (o); }
void remove (T *o) { ... };
list<T*> _m_children;
};
class _cell : public tree<_cell>
{
public:
_cell () { x = 0; y =0; }
long x,y;
};
模板
类树
{
公众:
void add(T*o){mum_children.push_back(o)}
无效删除(T*o){…};
列出你的孩子;
};
类单元:公共树
{
公众:
_单元(){x=0;y=0;}
长x,y;
};
但是现在我想更进一步,如果编码者愿意的话,让单元格可以引用。因此,我基本上实现了一个refTree类,它也只接受指针(_cell*)作为输入
template <typename T>
class refTree
{
public:
void add (T *o) { _ref<T> r = o; _m_children.push_back (r); }
void remove (T *o) { ... }
list<_ref<T> > _m_children;
};
模板
类参照树
{
公众:
void add(T*o){u ref r=o;_m_children.push_back(r)}
无效删除(T*o){…}
列出你的孩子;
};
此外,这仍然工作良好。使用
class _cell : public refTree<_cell>
{
:
};
class\u单元格:公共参照树
{
:
};
用户代码没有更改,但所有添加的_cell*现在都会在添加到树之前被引用
很好,但现在我希望能够在单元级别选择要使用的树模板实现。这意味着我必须使_cell-class成为一个以模板类为参数的模板类(所选的树模板)
模板
类单元格:public\uu TyTree//无法工作-毫无疑问,单元格需要输入
{
};
这里我们得到了递归问题-当然编译器无法解决这个问题,因为Cell正在等待一个树参数,它需要一个简单的类型参数(应该是Cell of c.正在等待一个树参数,它需要一个简单的…)
你明白了——什么是解决这类问题的正确方法?没有递归。
单元格
的模板参数是\uuu-TyTree
,而不是\uu-TyTree
模板
类单元格:公共树
{
};
int main()
{
单元格mycell0;//错误
Cell mycell 1;//确定。使用树
细胞菌丝2;
细胞菌丝3;
}
<> P.S.不应在
单元格
的模板参数是\uuu-TyTree
,而不是\uu-TyTree
模板
类单元格:公共树
{
};
int main()
{
单元格mycell0;//错误
Cell mycell 1;//确定。使用树
细胞菌丝2;
细胞菌丝3;
}
<> P.S。不应在
单元格
。因为Cell
是模板类。事实上,如果我没记错的话,你甚至不应该在一个前导下划线后面加一个大写字母。有没有什么地方可以让我查找这些约定?请检查。我想一切都好了。啊,是的,你是对的,现在编译好了。而带有双下划线的thanx预感将避免这种情况。有一件事仍然困扰着我——这里不接受默认参数——似乎我必须声明Cell mycell;我不能直接申报迈塞尔牢房;-有什么想法吗?如果想省略默认参数,应该编写单元格
。因为Cell
是模板类。事实上,如果我没记错的话,你甚至不应该在一个前导下划线后面加一个大写字母。有没有什么地方可以查到这种约定?嗯,我越想越喜欢。但是需要重新思考。谢谢你的帮助,在花了几个小时的时间在圈子里尝试评估不同的方法之后,我想我终于找到了一个解决方案——节点系统。因此,每个节点都可以连接到其他节点,并公开getNext、getPrev、getFirstChild、getParent等。。。单元源于节点,所以它可以直接访问它的子节点和父节点——这也意味着我不必为它实现模板,我想这总是一件好事。嗯,我越想它,我就越喜欢它。但是需要重新思考。谢谢你的帮助,在花了几个小时的时间在圈子里尝试评估不同的方法之后,我想我终于找到了一个解决方案——节点系统。因此,每个节点都可以连接到其他节点,并公开getNext、getPrev、getFirstChild、getParent等。。。单元是从节点派生的,所以它可以直接访问它的子节点和父节点——这也意味着我不必为它实现模板,我想这总是一件好事。
template <template <typename> class __TyTree = tree>
class Cell : public __TyTree <Cell> // cannot work - no question, Cell expects input
{
};
template <template <typename> class __TyTree = tree>
class Cell : public __TyTree <Cell<__TyTree> >
{
};
int main()
{
Cell mycell0; // error
Cell<> mycell1; // ok. tree is used
Cell<tree> mycell2;
Cell<refTree> mycell3;
}