2

MyWeight在 boost 图中有一个自定义边属性 ( ),并且想要应用 Dijkstra 最短路径搜索。

我的体重类型是,在 boost::operators 的帮助下,可加、可减、小于可比和相等可比。

因为我知道搜索必须从某些东西开始,所以我需要一个相当于零的值,并且要找出一个节点是否可以到达,这是一个非常大的东西。

MyWeight weight_zero(...), weight_inf(...);

// now, weight_zero is less than all other weights, weight_inf greater than all other weights.

boost::dijkstra_shortest_paths( G, target_idx, boost::predecessor_map(&predecessors[0])
    .distance_map(&distances[0])
    .distance_inf(weight_inf)
    .distance_zero(weight_zero)
            );

这是我使用自定义重量的原则。它使用 gcc 4.8.1 编译(并且似乎可以正常工作),但是使用 gcc 4.7.3 我得到以下错误(有点缩短):

/usr/include/c++/4.7/limits:-1: In instantiation of 'static constexpr _Tp std::numeric_limits<_Tp>::max() [with _Tp = MyWeight<2, MyEvaluator>]':
/usr/include/c++/4.7/limits:313: error: no matching function for call to 'MyWeight<2, MyEvaluator>::MyWeight(int)'

MyWeight实际上是一个模板)

我将此消息解释为“您的类型没有 std::numeric_limit”,另一方面,我告诉 BGL 使用哪个极值并且不明白为什么它会尝试调用数字限制。我认为在这里尝试的最好方法是numeric_limits识别我的自定义数据类型。

有人可以指出我如何做到这一点吗?

我在这里找到了第一个提示,但是该示例使用了digits和之类的成员digits10,我想知道它们的来源。

编辑

是一个像我一样的例子。无法编译,错误见上。

4

1 回答 1

1

这似乎是命名参数包装器中的一个错误(或缺陷;我不确定它是否可修复),即使不使用它们也会扩展默认值。如果您使用位置参数重载并手动填写所有参数,numeric_limits则不需要。

于 2013-08-19T08:25:56.403 回答