2016-12-03 71 views
1

飞递归结构,我想知道为什么下面的代码是错误的编译器:构建与向量

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}}; 

那是因为这种嵌套结构的构造不被支持,或者我所做的一切都是错误的?

+2

'矢量'不具有两个参数的构造函数服用'int'和'矢量'。如果你打算构建一个包含'foo'单个实例的矢量,那么这个工作就是这样的:'foo c = foo {1,vector {{1,vector {1}}}};' –

+0

@IgorTandetnik谢谢,我在找什么! – user7129841

回答

0

使用boost recursive wrapper

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

如果你不想使用升压或推出自己的包装,
考虑使用内部的指针。

+0

你为什么需要前向声明? – 0x499602D2

+0

@ 0x499602D2哦,你说得对。你没有。 –

0

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

这将创建Foo的矢量里面1个对象(自动生成的默认构造函数初始化):

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

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

auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}}, 
          foo{2, vector<foo>{1u}} }}; 
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不支持基于{}建设得非常好内它。使用移动构造函数的工作原理:

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