我最近查看了一些代码并发现了类似于以下内容的数据结构:
class TreeNode {
std::vector<TreeNode> subNodes;
};
如您所见,在定义TreeNode之前,使用TreeNode实例化容器。代码在GCC和MSVC下编译,但我记得看到有人说这不是保证行为。遗憾的是,我根本无法在标准中找到任何内容。
这些容器如何实施?标准是否保证了这种行为?如果标准不能保证这一点,我对这种设计有什么选择?
答案 0 :(得分:2)
这很好,因为std::vector<T>
类中不包含任何类型T
的具体实例:它通常使用指针实现。模板实例化std::vector<TreeNode>
不需要TreeNode
的完整定义。
std::vector<T>
通常作为指针的三元组实现(虽然标准不要求这样做):
template <typename T>
class vector
{
...
T* start;
T* end;
T* end_of_storage;
};
如果std::vector<T>
包含T
的具体实例,那么您就会遇到问题。以下不是合法的C ++,因为它创建了一个圆形的“有一个”定义:
template <typename T>
class container
{
T x;
};
class TreeNode
{
container<TreeNode> subNodes;
};