C++ 如何在同一个结构中声明结构的向量?

C++ 如何在同一个结构中声明结构的向量?,c++,vector,struct,C++,Vector,Struct,我试图创建一个结构,其中包含一个向量,其类型与该结构相同。但是,当我构建时,会出现一些错误,表明我缺少一个“;”在“>”出现之前。我不确定编译器是否认识到向量是一个东西,我已经在我的代码中包含了它。以下是我到目前为止的情况: #include <vector> typedef struct tnode { int data; vector<tnode> children; GLfloat x; //x coordinate of node

我试图创建一个结构,其中包含一个向量,其类型与该结构相同。但是,当我构建时,会出现一些错误,表明我缺少一个“;”在“>”出现之前。我不确定编译器是否认识到向量是一个东西,我已经在我的代码中包含了它。以下是我到目前为止的情况:

#include <vector>

typedef struct tnode
{
    int data;
    vector<tnode> children;
    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
} tnode;
#包括
类型定义结构tnode
{
int数据;
媒介儿童;
GLfloat x;//节点的x坐标
GLfloat y;//节点的y坐标
}tnode;
任何帮助都将不胜感激

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

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

#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
};
#包括
结构节点
{
int数据;
boost::container::vector子类;
GLfloat x;//节点的x坐标
GLfloat y;//节点的y坐标
};

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

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

提供可包含不完整类型的替代容器(包括
vector
)。递归数据类型(如您想要的数据类型)将作为本示例的一个用例提供

以下内容适用于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
};
#包括
结构节点
{
int数据;
//tnode在这里是一个不完整的类型,但是Boost.Container允许这样做
boost::container::vector子类;
GLfloat x;//节点的x坐标
GLfloat y;//节点的y坐标
};

< C++ >现在是否允许不完整类型作为容器的模板参数?我记得在C++03中,这是非法的。(只是想验证一下,如果确实允许的话,这是正确的语言选择。)@GManNickG我现在非常确信它不符合标准。谢谢你指出这一点!它不允许使用不完整的类型实例化任何
std
模板,这是未定义的行为,除非另有规定(明确允许
unique_ptr
shared_ptr
)@JonathanWakely:感谢确认。你知道这个问题是不是被提出来的吗?“我想我并不是唯一一个认为这应该被允许的人。”GManNickG根据第一个标准之前的讨论。然而,就拿这篇文章来说,它错误地宣称实现允许不完整类型的
std::map
是困难的/不可能的,而实际上两者都不是。@wilsonmichaelpatch这是微不足道的。事实上,一个简单的向量实现允许这样做。该标准在这里过于谨慎,给了实现者超出必要的回旋余地。这是一个不好的限制。@wilsonmichaelpatch:之所以可以这样做,是因为
vector
的成员函数在需要时才会被实例化,此时
tnode
将是一个完整的类型。@interjay当我包含boost/container/vector.hpp时,它给了我一个致命的错误。C1083(不确定这是否有帮助)。显然没有这样的文件或目录。我还添加了“使用名称空间boost::container”;但这似乎没有任何帮助。我对C++非常陌生,所以如果有明显的东西我也应该添加,那么我就错过了。@ Red Boost是一个常用的附加库,你需要安装,而不是标准库的一部分。你可以从boost.org下载。安装后,您需要设置include目录,请参阅或中的说明。您的意思肯定是
std::vector