【问题标题】:How do I declare a vector of a struct within that same struct?如何在同一个结构中声明一个结构的向量?
【发布时间】:2013-06-23 21:52:00
【问题描述】:

我正在尝试创建一个结构,其中包含一个类型为相同结构的向量。但是,当我构建时,错误表明我缺少“;”在“>”出现之前。我不确定编译器是否甚至将向量识别为事物:/并且我已经包含在我的代码中。这是我目前所拥有的:

#include <vector>

typedef struct tnode
{
    int data;
    vector<tnode> children;
    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
} tnode;

任何帮助将不胜感激!

【问题讨论】:

  • 你的意思是std::vector&lt;tnode&gt;

标签: c++ vector struct


【解决方案1】:

您的代码正在调用未定义的行为,因为标准容器(例如 vector)不能包含不完整的类型,而 tnode 是结构定义中的不完整类型。根据C++11标准,17.6.4.8p2:

在以下情况下效果未定义:[...] 如果在实例化模板组件时将不完整类型 (3.9) 用作模板参数,除非该组件特别允许。

Boost.Container library 提供了可以包含不完整类型的替代容器(包括vector)。递归数据类型(例如您想要的那种)作为 this 的用例给出。

以下内容适用于 Boost.Container:

#include <boost/container/vector.hpp>
struct tnode
{
    int data;

    //tnode is an incomplete type here, but that's allowed with Boost.Container
    boost::container::vector<tnode> children;

    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
};

【讨论】:

  • @wilsonmichaelpatrick 这很简单。事实上,一个简单的向量实现允许这样做。该标准在这里过于谨慎,并为实施者提供了不必要的余地。这是一个糟糕的限制。
  • @wilsonmichaelpatrick:可以这样做的原因是vector 的成员函数在需要它们之前不会被实例化,此时tnode 将是一个完整的类型。
  • @interjay 当我包含 boost/container/vector.hpp 时,它给了我一个致命错误。 C1083(不确定是否有帮助)。显然“没有这样的文件或目录”。
  • 我还添加了“使用命名空间 boost::container;”但这似乎没有任何帮助。我对 C++ 非常陌生,所以如果我还应该添加一些明显的东西,那我就错过了。
  • @red Boost 是您需要安装的常用附加库,而不是标准库的一部分。您可以从 boost.org 下载它。安装后,您需要设置包含目录,请参阅 boost.org/doc/libs/1_53_0/more/getting_started/windows.htmlstackoverflow.com/questions/2629421/… 的说明。
【解决方案2】:

您拥有的是not standards compliant(感谢@jonathanwakely 确认)。所以它是未定义的行为,即使它可以在一些流行的平台上编译。

boost container library 有一些类似标准库的容器确实支持这一点,因此您原则上可以修改您的结构以使用其中之一:

#include <boost/container/vector.hpp>
struct tnode
{
    int data;
    boost::container::vector<tnode> children;
    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
};

【讨论】:

  • C++ 现在是否允许不完整类型作为容器的模板参数?我记得在 C++03 中这是非法的。 (只是想验证一下,如果确实允许,这是正确的语言选择。)
  • @GManNickG 我现在非常确信它不符合标准。感谢您指出这一点!
  • 不允许,实例化任何具有不完整类型的std 模板是未定义的行为,除非另有说明(unique_ptrshared_ptr 明确允许)
  • @JonathanWakely:感谢您的确认。不知道这个问题有没有提出来?我想我不是唯一一个认为应该被允许的人。
  • @GManNickG 根据Matthew H. Austern,它在第一个标准之前已经讨论过了。然而,拿那篇文章持保留态度,它错误地声称实现允许不完整类型的std::map 是很难/不可能的,而实际上两者都不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2013-12-23
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多