2

ブースト グラフにカスタム エッジ プロパティ ( MyWeight) があり、ダイクストラ最短パス検索を適用したいと考えています。

私の重みのタイプは、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ここで試す最善の方法は、カスタム データ型を認識させることだと思います。

誰かがそれを達成する方法を教えてもらえますか?

ここで最初のヒントを見つけましたが、この例ではdigitsandのようなメンバーを使用しdigits10ており、それらがどこから来たのか知りたいです。

編集

これは私のような例です。コンパイルできません。エラーについては上記を参照してください。

4

1 に答える 1