У меня есть пользовательское свойство ребра (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
, и я хотел бы знать, откуда они взялись.
ИЗМЕНИТЬ
Это пример, подобный моему. Не могу скомпилировать, ошибки смотрите выше.