使用<Edge>initializer_list C++图形 - 如何在没有"Edge"字的情况下在initializer_list创建边缘?
Graph with initializer_list<Edge> C++ - How I do to create Edges at initializer_list without "Edge" word?
My Graph constructor:
Graph(std::initializer_list<Edge> list);
My Edge构造函数:
Edge(int out, int in);
我想用下面的方法创建我的图形:
Graph g = { (1,2), (3,4), (5,1), (5,3)};
但是我只是想要一个成功的编译如果我写:
Graph g = { Edge(1,2), Edge(3,4), Edge(5,1), Edge(5,3)};
我如何在没有"边缘"字的initializer_list中创建边缘?
使用{}
初始化每个成员;如果没有接受initializer_list
的构造函数,它将选择双参数构造函数
Graph g = { {1,2}, {3,4}, {5,1}, {5,3} };
但是,我发现这在一些旧的编译器上不起作用,在这种情况下,您可能不得不返回到编写Edge
。
您不能使用圆括号,但使用统一的初始化语法(即使用大括号)可以。
你所需要的是一个Edge
的构造函数,它接受两个整数(你已经有了)和一个std::initializer_list<Edge>
作为Graph
的构造函数的唯一参数(你几乎有,只是缺少模板参数):
#include <initializer_list> // FOR std::initializer_list
struct Edge
{
Edge(int out, int in) { /* ... */ }
// Do not put any constructor taking an std::initalizer_list here,
// otherwise it will be picked instead of the one above when using
// uniform initialization syntax.
// ...
};
struct Graph
{
Graph(std::initializer_list<Edge> list) { /* ... */ }
// ...
};
然后,你可以构造你的图如下:
int main()
{
Graph g1 = { {1,2}, {3,4}, {5,1}, {5,3} };
Graph g2 = { Edge(1,2), Edge(3,4), Edge(5,1), Edge(5,3) };
Graph g3 = { Edge{1,2}, Edge{3,4}, Edge{5,1}, Edge{5,3} };
}
下面是一个编译的实例
您使用的是父括号而不是大括号:
Graph g = { {1,2}, {3,4}, {5,1}, {5,3}};
这将实际调用Graph's
构造函数,接受std::initializer_list
。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- C2664 无法从'initializer list'转换参数
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法从'initializer-list'转换为用户控制器
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- VS2015无法从'initializer list'转换为'std::string'错误
- 编译器错误:"Non-aggregates cannot be initialized with initializer list."
- 无法转换...从 '<brace-enclosed initializer list>' 到 地图
- 无法将'<brace-enclosed initializer list>'转换为'double'作为回报
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'
- initializer语言 - list不能转换为const margin *