使用Array!T和opSlice()时,std.algorithm.sorting失败并出现模糊错误

时间:2015-10-18 12:29:47

标签: arrays sorting d phobos

我确信我在这里遗漏了一些明显的东西 - 剩下的D(甚至是编译器错误)都非常明智且易于理解。我有std.containers.Array个可比较的结构,我想对它进行排序。 std.containers文档指出,为了使用std.algorithm中的内容,您需要使用array[]array.opSlice()对其进行切片。好的,没问题。

然而,如果我制作一个Array两个非常微不足道的类型,它就不会排序 - 相反,它告诉我在Phobos内部的一个例行程序并不是非常的(?)

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调用因上述编译器错误而失败。使用VS Community 2015中的DMD2构建,我找不到编译器版本标识符,但这只是昨天才下载的。

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 个答案:

答案 0 :(得分:5)

Phobos中的错误:Issue #14981

它已经修复了一个月之前,但尚未发布变化尚未发布。可能会在2.069中提供。

目前,您可以在发布模式下构建项目。