Сбой std.algorithm.sorting с непонятными ошибками при использовании Array!T и opSlice()
Я уверен, что упускаю что-то очевидное здесь - остальная часть D (даже ошибки компилятора) была очень разумной и простой для понимания. у меня есть std.containers.Array
сопоставимых структур, и я хотел бы отсортировать его. std.containers
документация отмечает, что для того, чтобы использовать материал в std.algorithm
Вы должны нарезать его, либо с array[]
или же array.opSlice()
, Хорошо, без проблем.
Однако, если я сделаю Array
из двух довольно тривиальных типов, он не будет сортировать - вместо этого он говорит мне, что рутина глубоко в Фобосе не nothrow (?)
B:\lib\D\dmd2\windows\bin\..\..\src\phobos\std\range\package.d(7189): Error: 'std.range.SortedRange!(RangeT!(Array!(MyInt)), "a < b").SortedRange.dbgVerifySorted' is not nothrow
B:\lib\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\sorting.d(982): Error: template instance std.range.assumeSorted!("a < b", RangeT!(Array!(MyInt))) error instantiating
main.d(21): instantiated from here: sort!("a < b", cast(SwapStrategy)0, RangeT!(Array!(MyInt)))
Минимальный пример ниже. Первый sort
(автоматически сгенерированный стандартный массив из двух значений) сортируется нормально. Другой sort
вызовы терпят неудачу с вышеупомянутыми ошибками компилятора. При сборке с DMD2 из VS Community 2015 я не могу найти идентификатор версии компилятора, но он был загружен только вчера.
import std.array;
import std.container.array;
import std.algorithm.sorting;
struct MyInt
{
int data;
int opCmp(MyInt o)
{
return data - o.data;
}
}
int main(string[] argv)
{
MyInt ami, bmi;
Array!MyInt arr = [ ami, bmi ];
sort([ami, bmi]);
sort(arr[0..2]);
sort(arr[]);
sort(arr.opSlice());
return 0;
}
1 ответ
Это ошибка в Фобосе: выпуск № 14981
Это было исправлено, как месяц назад, но изменения еще не сделали это в выпуске. Вероятно, будет доступно в версии 2.069.
В качестве временного решения вы можете построить свой проект в режиме релиза.