【问题标题】:Recursive containers in C++? [duplicate]C ++中的递归容器? [复制]
【发布时间】:2025-11-28 09:00:02
【问题描述】:

可能重复:
Are C++ recursive type definitions possible, in particular can I put a vector<T> within the definition of T ?

我最近在看一些代码,发现一个类似于以下的数据结构:

class TreeNode {
    std::vector<TreeNode> subNodes;
};

如您所见,在定义 TreeNode 之前,使用 TreeNode 实例化容器。该代码在 GCC 和 MSVC 下编译,但我记得看到有人说这不是保证行为。不幸的是,我在讨论这个问题的标准中根本找不到任何东西。

如何实现这样的容器?标准是否保证了这种行为?如果标准不能保证这一点,我有什么替代方案可以替代这个设计?

【问题讨论】:

  • 之前有一个完全一样的问题..现在我必须找到它!

标签: c++ recursion containers


【解决方案1】:

这很好,因为std::vector&lt;T&gt; 类中不包含T 类型的任何具体实例:它通常使用指针实现。模板实例化std::vector&lt;TreeNode&gt; 不需要TreeNode 的完整定义。

std::vector&lt;T&gt; 通常实现为指针的三元组(尽管这不是标准要求的):

template <typename T>
class vector
{
  ...
  T* start;
  T* end;
  T* end_of_storage;
};

如果std::vector&lt;T&gt; 确实 包含T 的具体实例,那么您将遇到问题。以下不是合法的 C++,因为它创建了一个循环“具有”定义:

template <typename T>
class container
{
  T x;
};

class TreeNode
{
  container<TreeNode> subNodes;
};

【讨论】:

  • 这很有趣,但是当includeing 向量时,不是必须引入完整的std::vector 实现吗?在哪种情况下不需要知道类型 T 的大小?实现如何解决这个问题?
  • 你是“对的”,所以我不会投反对票,但标准规定,对标准库模板的模板参数使用不完整类型会导致未定义的行为,所以从技术上讲,答案是“不,你不能这样做。”