我正在用 D 编写一个 trie,我希望每个 trie 对象都有一个指向某些数据的指针,如果节点是 trie 中的终端节点,则该指针具有非 NULL 值,否则为 NULL。在创建 trie 之前,数据的类型是不确定的(在 C 中,这将使用 a 来完成void *
,但我打算使用模板来完成),这就是为什么需要指向堆对象的指针的原因之一。
这要求我最终在堆上创建我的数据,此时它可以被 trie 节点指向。实验,它似乎new
执行了这个任务,就像它在 C++ 中所做的一样。但是由于某种原因,这会因字符串而失败。以下代码有效:
import std.stdio;
void main() {
string *a;
string b = "hello";
a = &b;
writefln("b = %s, a = %s, *a = %s", b, a, *a);
}
/* OUTPUT:
b = hello, a = 7FFF5C60D8B0, *a = hello
*/
但是,这失败了:
import std.stdio;
void main() {
string *a;
a = new string();
writefln("a = %s, *a = %s", a, *a);
}
/* COMPILER FAILS WITH:
test.d(5): Error: new can only create structs, dynamic arrays or class objects, not string's
*/
是什么赋予了?如何在堆上创建字符串?
PS 如果编写 D 编译器的人正在阅读此内容,则“字符串”中的撇号是语法错误。