我想知道为什么以下代码对编译器有误:
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}};
这是因为不支持这种嵌套结构构造还是我做错了?
答案 0 :(得分:0)
#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, {}} )}};