飞递归结构,我想知道为什么下面的代码是错误的编译器:构建与向量
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}};
那是因为这种嵌套结构的构造不被支持,或者我所做的一切都是错误的?
飞递归结构,我想知道为什么下面的代码是错误的编译器:构建与向量
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}};
那是因为这种嵌套结构的构造不被支持,或者我所做的一切都是错误的?
#include <boost/variant/recursive_wrapper.hpp>
struct foo;
struct foo {
int a;
vector<boost::recursive_wrapper<foo>> b;
};
如果你不想使用升压或推出自己的包装,
考虑使用内部的指针。
你为什么需要前向声明? – 0x499602D2
@ 0x499602D2哦,你说得对。你没有。 –
你做了一个小错误,当然它有效,但你需要使用正确的vector
构造函数。
这将创建Foo的矢量里面1个对象(自动生成的默认构造函数初始化):
auto v = vector<foo>{1u};
可以列出对象,您创建明确:
auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}},
foo{2, vector<foo>{1u}} }};
它实际上是非法的将不完整的类型传递给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, {}})}};
'矢量'不具有两个参数的构造函数服用'int'和'矢量'。如果你打算构建一个包含'foo'单个实例的矢量,那么这个工作就是这样的:'foo c = foo {1,vector {{1,vector {1}}}};' –
@IgorTandetnik谢谢,我在找什么! – user7129841