用向量构建飞行递归结构

时间:2016-12-03 04:47:42

标签: c++ c++11

我想知道为什么以下代码对编译器有误:

struct foo {
    int a;
    vector<foo> b;
};

int main() {
    foo c = foo{1, vector<foo>{1, vector<foo>{1}}};
}

然而它编译了这个:

foo c = foo{1, vector<foo>{1}};

这是因为不支持这种嵌套结构构造还是我做错了?

3 个答案:

答案 0 :(得分:0)

使用boost recursive wrapper

#include <boost/variant/recursive_wrapper.hpp>
struct foo;
struct foo {
    int a;
    vector<boost::recursive_wrapper<foo>> b;
};

如果您不想使用提升或滚动自己的包装,
考虑在内部使用指针。

答案 1 :(得分:0)

你犯了一个小错误,当然它有效但你需要使用正确的vector构造函数。

这里创建了foo的向量,里面有一个对象(用自动生成的默认构造函数初始化):

auto v = vector<foo>{1u};

您可以列出明确创建的对象:

auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}},
                             foo{2, vector<foo>{1u}} }};

答案 2 :(得分:0)

将不完整的类型传递给std::vector实际上是违法的。真的没有理由说它是非法的,但标准是这样说的。

如果输入以下内容,您的代码将编译并运行:

foo c = foo{1, vector<foo>{{1, vector<foo>{1}}}};

注意额外的{}集。但它不符合标准,至少使用C ++ 11。

有几种类型,例如std::unique_ptr。您可以合法地vector<unique_ptr<Foo>>

foo c = {1, {std::make_unique<Foo>( 1 )}};

但请注意,make_unique不能很好地支持基于{}的构建。使用移动ctor工作:

foo c = {1, {std::make_unique<Foo>( Foo{1, {}} )}};