Pointers D:std.container.BinaryHeap的奇怪行为,带有用于比较的自定义函数

Pointers D:std.container.BinaryHeap的奇怪行为,带有用于比较的自定义函数,pointers,struct,d,binary-heap,Pointers,Struct,D,Binary Heap,我已经为一堆节点*s编写了以下代码,它们位于模块节点中: import std.exception, std.container; public import node; alias NodeArray = Array!(const (Node)*); alias NodeHeap = BinaryHeap!(NodeArray, cmp_node_ptr); auto make_heap() { return new NodeHeap(NodeArray(cast(const(Nod

我已经为一堆
节点*
s编写了以下代码,它们位于模块
节点
中:

import std.exception, std.container;

public import node;

alias NodeArray = Array!(const (Node)*);
alias NodeHeap = BinaryHeap!(NodeArray, cmp_node_ptr);

auto make_heap() {
  return new NodeHeap(NodeArray(cast(const(Node)*)[]));
}

void insert(NodeHeap* heap, in Node* u) {
  enforce(heap && u);
  heap.insert(u);
}

pure bool cmp_node_ptr(in Node* a, in Node* b) {
  enforce(a && b);
  return (a.val > b.val);
}
然后我尝试在它上运行以下单元测试,其中
make\u leaf
返回一个用给定参数初始化的
节点*

unittest {
  auto u = make_leaf(10);
  auto heap = make_heap();
  insert(heap, u); //bad things happen here
  assert(heap.front == u);
  auto v = make_leaf(20);
  insert(heap, v);
  assert(heap.front == u); //assures heap property
}

测试使其到达标记为注释的行I,然后在
cmp\u node\u ptr
中的
emforce(a&b)
行抛出强制错误。我完全不明白为什么会发生这种情况。

您在这个操作员身上做了错事:

NodeArray(cast(const(Node)*)[])
显然,您希望创建空的NodeArray,但实际得到的是带有一个空项的NodeArray。NodeArray构造函数将新数组的值列表作为参数,并传递一个“空数组”(本质上为null),从而使用一个null元素创建NodeArray

正确的方法是:

NodeArray()
i、 e:

改变一下,一切都会好起来的

p、 似乎多个U型参数的D表示法(U[]值…)使您认为构造函数接受另一个数组作为初始化器

p、 抱歉,修复了make_heap()代码:意外忘记在其中写入“noderray()”。并再次编辑它,因为此处不需要空的noderray()调用。双重错误

auto make_heap() {
  return new NodeHeap();
}