Boost-max-flow算法不编译。错误:正在形成对void的引用

Boost-max-flow算法不编译。错误:正在形成对void的引用,boost,max-flow,edmonds-karp,push-relabel,Boost,Max Flow,Edmonds Karp,Push Relabel,Boost提供了三种不同的算法来查找有向图中的最大流:boykov_kolmogorov、edmonds_karp和push_relabel。它们都有命名和非命名参数版本。它们使用的参数集也非常相似。尽管如此,使用相同的参数,这些算法中的一些可以编译,而另一些则不能 push_relabel可以很好地编译命名和非命名版本: using Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS

Boost提供了三种不同的算法来查找有向图中的最大流:boykov_kolmogorovedmonds_karppush_relabel。它们都有命名和非命名参数版本。它们使用的参数集也非常相似。尽管如此,使用相同的参数,这些算法中的一些可以编译,而另一些则不能

push_relabel可以很好地编译命名和非命名版本:

  using Graph =
    boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
                        VertexProperty, EdgeProperty>;
  auto props = boost::capacity_map(capacity)
               .residual_capacity_map(residual_capacity)
               .reverse_edge_map(reverse_edge_map)
               .vertex_index_map(vertex_index_map)
               .color_map(color_map)
               .predecessor_map(predcessor_map)
               .distance_map(distance_map);
  boost::push_relabel_max_flow(g, s, t, props);
  boost::push_relabel_max_flow(g, s, t, capacity, residual_capacity,
                   reverse_edge_map, vertex_index_map);
  boost::boykov_kolmogorov_max_flow(g, capacity, residual_capacity,
                                    reverse_edge_map,
                                    vertex_index_map, s, t);
  boost::boykov_kolmogorov_max_flow(g, s, t, props);
但命名版本失败:

  using Graph =
    boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
                        VertexProperty, EdgeProperty>;
  auto props = boost::capacity_map(capacity)
               .residual_capacity_map(residual_capacity)
               .reverse_edge_map(reverse_edge_map)
               .vertex_index_map(vertex_index_map)
               .color_map(color_map)
               .predecessor_map(predcessor_map)
               .distance_map(distance_map);
  boost::push_relabel_max_flow(g, s, t, props);
  boost::push_relabel_max_flow(g, s, t, capacity, residual_capacity,
                   reverse_edge_map, vertex_index_map);
  boost::boykov_kolmogorov_max_flow(g, capacity, residual_capacity,
                                    reverse_edge_map,
                                    vertex_index_map, s, t);
  boost::boykov_kolmogorov_max_flow(g, s, t, props);
/celibs/boost_1_73_0/boost/graph/detail/adjacence_list.hpp:2768:17:错误:形成对void的引用

edmonds_karp命名和非命名版本均失败,错误相同:

boost::edmonds_karp_max_flow(g, s, t, props);
boost::edmonds_karp_max_flow(g, s, t, capacity, residual_capacity, reverse_edge_map,
                          color_map, predcessor_map);
/celibs/boost_1_73_0/boost/concept_check.hpp:147:9:错误:使用删除的函数

完整示例如下:

我是否以错误的方式传递参数?如何正确地通过它们


谢谢

这似乎确实是一个bug

当没有定义内部
边缘容量
属性时,
边缘容量
选择\u const\u pmap
似乎会失败()

定义一个使问题消失。但是,我们可以检查它是否始终优先于通过命名参数提供的参数:

struct Oops {};
using EdgeProperty = boost::property<boost::edge_capacity_t, Oops>;
structoops{};
使用EdgeProperty=boost::property;
导致编译问题,表明选择了错误的属性映射

我找不到这种行为的明显原因-所有其他命名参数的行为都与预期的一样,并且以非常相似的方式声明(该过程由宏自动完成)。我想会有一些非常微妙的事情(比如名字冲突或ADL事故?)

以下是对我有效的代码:

(注意,显然无法成功运行,因为它不满足任何不变量)

\define BOOST\u ALLOW\u弃用的\u头
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
结构VertexProperty final{};
//结构EdgeProperty final{};
使用EdgeProperty=boost::property;
使用图形=
boost::邻接列表;
使用Edge=boost::graph\u traits::Edge\u描述符;
使用Vertex=boost::graph\u traits::Vertex\u描述符;
autog=图{};
自动s=顶点{};
自动t=顶点{};
自动剩余容量map=std::vector{};
自动反转gemap=std::vector{};
auto colorMap=std::vector{};
自动预处理映射=std::vector{};
自动距离映射=std::vector{};
自动顶点索引映射=
boost::make_函数_属性_映射([](顶点){返回0;});
自动边索引映射=
boost::make_函数_属性_映射([](边){return 0;});
//自动容量=boost::生成函数属性映射([](边缘){返回0;});
自动容量=boost::get(boost::edge\u容量,g);
自动剩余容量=boost::生成迭代器属性映射(
剩余容量映射。begin(),边索引映射);
自动反转边映射=boost::生成迭代器属性映射(
reverseEdgeMap.begin(),边索引映射);
自动彩色地图=
boost::生成迭代器属性映射(colorMap.begin(),顶点索引映射);
自动预处理器\u映射=boost::生成迭代器\u属性\u映射(
predecessormap.begin(),顶点索引映射);
自动距离映射=boost::生成迭代器属性映射(distanceMap.begin(),
顶点索引图);
自动道具=增强::容量图(容量)
.剩余容量图(剩余容量)
.反向边缘映射(反向边缘映射)
.顶点索引映射(顶点索引映射)
.颜色映射(颜色映射)
.前置机映射(前置机映射)
.距离地图(距离地图);
推动:推动重新标记最大流量(g、s、t、道具);
增压:推压重新标记最大流量(g、s、t、容量、剩余容量、,
反向(边映射、顶点索引映射);
boykov_kolmogorov_最大流量(g,容量,剩余容量,
反向边映射,顶点索引映射,s,t);
boykov_kolmogorov_max_流量(g、s、t、道具);
推进:爱德蒙兹卡普马克斯流量(g、s、t、道具);
增压:edmonds_karp_最大流量(g、s、t、容量、剩余容量、,
反向(边缘图、颜色图、预处理器图);
}

你可以看到所有的算法调用现在编译。

请考虑向库DEVS报告这个问题,非常感谢!在github上创建了一个问题: