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

Bil*_*ter 30 c++

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

struct Move
{
    int src;
    int dst;
};

struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};
Run Code Online (Sandbox Code Playgroud)

我必须承认,我认为不可能直接这样做,我认为MoveTree中的MoveTree矢量将被禁止.但无论如何我都试过了,它的效果非常好.我正在使用Microsoft Visual Studio 2010 Express.

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

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

Naw*_*waz 29

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

该规范在§17.4.3.6/ 2中说,

特别是,在以下情况下,效果未定义:

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

  • 我认为这需要更新.请参阅[this](http://stackoverflow.com/q/41913578/1870232) (8认同)
  • 实际上给出正确答案的+1一,引用标准来做到这一点. (4认同)
  • 我试图找到解释*的确切引用,其中*是在上面的代码中实例化的向量.任何提示? (3认同)
  • 在来回走动之后,我相信你引用的声明实际上是模板实例化的重点.如果它在成员函数中(包括构造函数,无论是用户定义还是隐式生成)那么代码就是正确的,因为在方法的定义中一个类被认为是完整的(即如果实例化的那个地方`MoveTree: :MoveTree():variation(){}`那么代码就是正确的(§14.7.1解释了对于那些好奇的读者而言隐式实例化的规则) (2认同)

Meh*_*ari 5

MoveTree是其定义内的不完整类型。该标准不保证实例类型不完整的STL模板的实例化。

  • 我认为这需要更新。请参阅[this](http://stackoverflow.com/q/41913578/1870232) (2认同)

Dav*_*nch 5

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

struct Move
    {
        int src;
        int dst;
    };

struct MoveTree;

struct MoveTree
    {
        Move move;
        std::vector<MoveTree*> variation;
    };
Run Code Online (Sandbox Code Playgroud)

  • 如果你唯一的工具是锤子,那么一切都是钉子。 (4认同)
  • 或者,您可以使用“shared_ptr&lt;vector&lt;MoveTree&gt;&gt;variation”并仅动态分配向量(它将按值包含对象)。这会对更改对象的值语义产生负面影响,因此您需要提供复制构造函数/赋值运算符。 (2认同)
  • 请注意,动态分配的对象(即“shared_ptr”)的数量大致相同,因为每个“MoveTree”要么由“smart_ptr”保存,要么将“smart_ptr”保存到向量,我更喜欢保存向量,因为它允许您发布对其的*引用*,并且用户代码不需要修改(可以遍历 `vector&lt;MoveTree&gt;`,不需要执行额外的取消引用)。 (2认同)