用载体建立在苍蝇递归结构上
constructing on the fly recursive structure with vector
我想知道为什么以下代码对编译器是错误的:
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}};
是因为不支持这种嵌套结构构造或我做错了吗?
使用Boost递归包装器:
#include <boost/variant/recursive_wrapper.hpp>
struct foo;
struct foo {
int a;
vector<boost::recursive_wrapper<foo>> b;
};
如果您不想使用Boost或滚动自己的包装器,
考虑内部使用指针。
您犯了小错误,当然可以使用,但是您需要使用正确的vector
构造函数。
这将在内部使用1个对象(使用自动生成的默认构造函数初始化)创建FOO的向量:
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
在其中不太支持基于{}
的结构。使用移动CTOR作品:
foo c = {1, {std::make_unique<Foo>( Foo{1, {}} )}};
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 用载体建立在苍蝇递归结构上