boost::graph пользовательский тип веса: numeric_limits необходим?

У меня есть пользовательское свойство ребра (MyWeight) в графе повышения, и я хочу применить поиск кратчайшего пути Дейкстры.

Мой весовой тип, с помощью операторов boost::, добавляется, вычитается, меньше, чем сравнимый и сравнимый по равенству.

Поскольку я знаю, что поиск должен начинаться с чего-то, мне нужен эквивалент нуля, а чтобы узнать, достижим ли узел, что-то очень большое.

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, и я хотел бы знать, откуда они взялись.

ИЗМЕНИТЬ

Это пример, подобный моему. Не могу скомпилировать, ошибки смотрите выше.


person user4344    schedule 19.08.2013    source источник
comment
Возможно, вы захотите сообщить о ней как об ошибке повышения, если это уже не так.   -  person Jan Hudec    schedule 19.08.2013
comment
Я сделаю это. Я создал пример программы, которая отказывается компилироваться, с другой версией пока не могу протестировать, но схема та же.   -  person user4344    schedule 19.08.2013


Ответы (1)


Похоже, это ошибка (или недостаток; я не уверен, что это можно исправить) в оболочке именованных параметров, которая расширяет значения по умолчанию, даже если они не используются. Если вы используете перегрузку позиционных аргументов и заполняете все аргументы вручную, numeric_limits не нужны.

person Jan Hudec    schedule 19.08.2013