如何在一个结构体中声明一个结构体向量?

4

我正在尝试创建一个结构体,其中包含一个类型为该结构体的向量。但是,在构建时,出现了指示我在'>'之前缺少';'的错误。我不确定编译器是否认识向量作为一个东西:/我已经在我的代码中包含了。这是我目前的代码:

#include <vector>

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

任何帮助都将不胜感激!!

1
你肯定是指 std::vector<tnode> 吧? - celtschk
2个回答

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

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

Boost.Container库提供了替代容器(包括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
};

2
@wilsonmichaelpatrick 这很简单。事实上,一个天真的向量实现就可以做到这一点。标准在这里过于谨慎,给予实现者比必要更多的自由。这是一个不好的限制。 - Konrad Rudolph
1
@wilsonmichaelpatrick:之所以可以这样做,是因为vector的成员函数只有在需要时才会被实例化,而在那个时候,tnode将是一个完整的类型。 - interjay
@interjay 当我包含boost/container/vector.hpp时,它会给我一个致命错误。C1083(不确定是否有帮助)。显然,出现了“没有这样的文件或目录”。 - red
我还添加了 "using namespace boost::container;",但似乎没有任何帮助。我非常非常新手C ++,所以如果还有一些明显的东西我应该添加,那么我可能错过了它。 - red
@red Boost是一个常用的附加库,需要安装,不属于标准库的一部分。您可以从boost.org下载它。安装后,您需要设置包含目录,请参阅http://www.boost.org/doc/libs/1_53_0/more/getting_started/windows.html或https://dev59.com/b3E85IYBdhLWcg3wwWQb上的说明。 - interjay

3
你所拥有的是不符合标准(感谢@jonathanwakely确认)。因此,即使它在一些流行平台上编译,也是未定义行为Boost容器库具有一些类似于标准库的容器,支持这一点,因此你原则上可以修改你的结构体来使用其中之一。
#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
};

1
C++现在是否允许不完整类型作为容器的模板参数?我记得在C++03中这是非法的。(只是想确认,如果确实允许,那么这是正确的语言选择。) - GManNickG
@GManNickG,我现在非常确信它不符合标准。谢谢你指出这一点! - juanchopanza
2
不允许使用不完整类型实例化任何std模板,除非另有规定(对于unique_ptrshared_ptr明确允许)。这是未定义的行为。 - Jonathan Wakely
1
@JonathanWakely:感谢您的确认。您知道是否有人提出过这个问题吗?我想我不是唯一一个认为应该允许的人。 - GManNickG
1
根据Matthew H. Austern的说法,这个问题在第一个标准之前就已经讨论过了。然而,需要对这篇文章持保留态度,因为它错误地声称实现允许不完整类型的std::map会很困难/不可能,而实际上并非如此。 - Konrad Rudolph
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接