C++ C++;模板递归-如何解决?

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_

我又被模板卡住了

比如说,我想实现一个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_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.不应在Y.TyTrase>代码中使用两个前导下划线,因为它是由C++标准保留用于实现目的的。

< P>没有递归。
单元格
的模板参数是
\uuu-TyTree
,而不是
\uu-TyTree

模板
类单元格:公共树
{
};
int main()
{
单元格mycell0;//错误
Cell mycell 1;//确定。使用树
细胞菌丝2;
细胞菌丝3;
}

<> P.S。不应在Y.TyTrase/COD>中使用两个领先的下划线,因为它是由C++标准保留用于实现目的的。

< p>您有两个单独的问题:单元中的内容以及单元格是如何连接的。为此,需要使用两个独立的数据结构。换句话说,要打破的正确链接是从树中继承细胞。你节省的少量内存是不值得的——放弃“侵入式”方法。细胞不应该知道树容纳它的方式

您有两个独立的问题:一个单元中有什么以及单元之间如何连接。为此,需要使用两个独立的数据结构。换句话说,要打破的正确链接是从树中继承细胞。你节省的少量内存是不值得的——放弃“侵入式”方法。细胞不应该知道树容纳它的方式

请查收。我想一切都好了。啊,是的,你是对的,现在编译好了。而带有双下划线的thanx预感将避免这种情况。有一件事仍然困扰着我——这里不接受默认参数——似乎我必须声明Cell mycell;我不能直接申报迈塞尔牢房;-有什么想法吗?如果想省略默认参数,应该编写
单元格
。因为
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;
}