gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:42:10 25 4
gpt4 key购买 nike

我又被模板困住了。

比如说,我想实现一个 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;
};

但现在我想更进一步,如果编码员愿意的话,让单元格可引用。所以我基本上实现了一个 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;
};

此外,这仍然可以正常工作。使用

class _cell : public refTree<_cell>
{
:
};

用户代码没有变化,但所有添加的 _cell* 现在在添加到树之前被引用。

很好,但现在我希望能够在 _cell 级别上选择要使用的树模板实现。所以这意味着我必须使 _cell - 类成为一个模板类,它将模板类作为参数(选择的树模板)。

template <template <typename> class __TyTree = tree>
class Cell : public __TyTree <Cell> // cannot work - no question, Cell expects input
{
};

这里我们遇到了递归问题 - 当然编译器无法解决这个问题,因为 Cell 正在等待树 - 参数,它需要一个简单类型的参数(应该是 Cell ofc。正在等待树 - 参数这是期待一个简单的....)。

你明白了 - 什么是解决这类问题的正确方法?

最佳答案

没有递归。 Cell 的模板参数是__TyTree , 不是 __TyTree<Cell> .

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;
}

附言您不应在 __TyTree 中使用两个前导下划线因为它被 C++ 标准保留用于实现目的。

关于C++ 模板递归 - 如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com