2015-10-18 8 views
2

Уверен, что мне не хватает чего-то очевидного здесь - остальная часть D (даже ошибки компилятора) была очень разумной и простой в использовании Понимаю. У меня есть std.containers.Array сопоставимых структур, и я бы хотел его отсортировать. в документации std.containers указано, что для использования материала в std.algorithm вам необходимо нарезать его либо array[], либо array.opSlice(). Хорошо, без проблем.std.algorithm.sorting терпит неудачу с неясными ошибками при использовании Array! T и 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; 
} 

ответ

5

Это ошибка в Phobos: Issue #14981

Это было зафиксировано, как месяц назад, но изменения не сделали это к отпуску еще. Вероятно, он будет доступен в 2.069.

В настоящее время вы можете создать свой проект в режиме освобождения.

+0

Это очень раздражает! Я могу заставить его работать в режиме отладки путем преобразования в стандартный массив: 'auto arr2 = std.array.array (arr []); сортировать (arr2); arr = Array! MyInt (arr2); 'но это совсем не идеально подходит для производительности или читаемости ... Спасибо в любом случае! – TheWyrdsmith