是否可以C++递归类型定义,特别是我可以在 T 的定义中放置一个向量<T>吗?

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

本文关键字:定义 一个 lt 向量 gt 递归 类型 C++ 特别是 是否 我可以      更新时间:2023-10-16

对于我的一个项目,我真正想做的是这样(将其简化到最低限度);

struct Move
{
    int src;
    int dst;
};
struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};

我必须承认,我认为不可能直接做到这一点,我认为MoveTree中的MoveTree向量会被禁止。但我还是试过了,效果很好。我正在使用Microsoft Visual Studio 2010学习版。

这是便携式的吗?这是好的练习吗?我有什么要担心的吗?

编辑:我问了第二个问题,希望能找到一个好的方法。

C++标准(2003)明确指出,实例化具有不完整类型的标准容器会调用未定义的行为。

规范在§17.4.3.6/2 中规定

特别是,在以下情况下,影响是不明确的:

__[..]
--如果在实例化模板组件时使用不完整类型(3.9)作为模板参数
__[..]

随着C++17标准的出现,情况发生了变化,该标准明确允许std::liststd::vectorstd::forward_list进行这种类型的递归。有关参考,请参见http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html答案是:如何声明同一类的成员向量?

MoveTree在其定义中是一个不完整的类型。该标准不保证具有不完整类型的STL模板的实例化。

使用指向Vector中类型的指针,这将是可移植的。

struct Move
    {
        int src;
        int dst;
    };
struct MoveTree;
struct MoveTree
    {
        Move move;
        std::vector<MoveTree*> variation;
    };

std::vector中的MoveTree元素位于已分配的(如new []中)数组中。只有控制信息(指向数组的指针、大小等)存储在MoveTree内的std::vector内。

不,它不可移植。codepad.org不编译它。

t.cpp:14:   instantiated from here
Line 215: error: '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a' has incomplete type
compilation terminated due to -Wfatal-errors.

使用vector时,应为MoveMoveTree定义复制构造函数和赋值运算符,否则将使用编译器生成的,这可能会导致问题。