无法定义关联数组类型:opEquals 不存在
Can't define an associative array type: opEquals doesn't exist
我不能使用 non-primitive 类型作为关联数组的键;尝试这样做将导致我定义 AA 的行出现以下错误:
Error: AA key type MyString does not have 'bool opEquals(ref const MyString) const
我第一次发现这个是在使用类型 CollisionHandler[Tuple!(TypeInfo, TypeInfo)]
时,其中 CollisionHandler
是函数指针类型的别名。
但是,即使 Associative array documentation page 下 "Using Structs or Unions as the KeyType" 标题中的示例代码也会失败并出现相同的错误:
import std.string;
struct MyString
{
string str;
size_t toHash() const @safe pure nothrow
{
size_t hash;
foreach (char c; str)
hash = (hash * 9) + c;
return hash;
}
// opEquals defined here?
bool opEquals(ref const MyString s) const @safe pure nothrow
{
return std.string.cmp(this.str, s.str) == 0;
}
}
int[MyString] foo; // errors here
void main() {
}
在这里,MyString.opEquals
被定义并且应该有正确的签名,但是 dmd 编译器说它没有实现。这个片段直接来自文档这一事实让我怀疑这是一个编译器错误,但也许我只是遗漏了什么?
运行DMD在Linux下,但在Windows下也有问题 7.DMD版本:
$ dmd --help
DMD64 D Compiler v2.066.1
Copyright (c) 1999-2014 by Digital Mars written by Walter Bright
Documentation: http://dlang.org/
...
这是编译器发出误导性错误消息的情况。
问题出在 opEquals
方法上的 @safe
注释。在 2.066.1 中,std.string.cmp
不是 @safe
- 但是,编译器会显示错误的错误消息。如果您将 opEquals
重命名为其他名称,例如foo
,您将收到不同的错误消息:
test.d(19): Error: safe function 'test.MyString.foo' cannot call system function
'std.algorithm.cmp!("a < b", string, string).cmp'
解决方法是删除 @safe
,或将其替换为 @trusted
。
注意这个问题在DMD的开发版中没有出现,所以应该会在2.067.0中修复。
我不能使用 non-primitive 类型作为关联数组的键;尝试这样做将导致我定义 AA 的行出现以下错误:
Error: AA key type MyString does not have 'bool opEquals(ref const MyString) const
我第一次发现这个是在使用类型 CollisionHandler[Tuple!(TypeInfo, TypeInfo)]
时,其中 CollisionHandler
是函数指针类型的别名。
但是,即使 Associative array documentation page 下 "Using Structs or Unions as the KeyType" 标题中的示例代码也会失败并出现相同的错误:
import std.string;
struct MyString
{
string str;
size_t toHash() const @safe pure nothrow
{
size_t hash;
foreach (char c; str)
hash = (hash * 9) + c;
return hash;
}
// opEquals defined here?
bool opEquals(ref const MyString s) const @safe pure nothrow
{
return std.string.cmp(this.str, s.str) == 0;
}
}
int[MyString] foo; // errors here
void main() {
}
在这里,MyString.opEquals
被定义并且应该有正确的签名,但是 dmd 编译器说它没有实现。这个片段直接来自文档这一事实让我怀疑这是一个编译器错误,但也许我只是遗漏了什么?
运行DMD在Linux下,但在Windows下也有问题 7.DMD版本:
$ dmd --help
DMD64 D Compiler v2.066.1
Copyright (c) 1999-2014 by Digital Mars written by Walter Bright
Documentation: http://dlang.org/
...
这是编译器发出误导性错误消息的情况。
问题出在 opEquals
方法上的 @safe
注释。在 2.066.1 中,std.string.cmp
不是 @safe
- 但是,编译器会显示错误的错误消息。如果您将 opEquals
重命名为其他名称,例如foo
,您将收到不同的错误消息:
test.d(19): Error: safe function 'test.MyString.foo' cannot call system function
'std.algorithm.cmp!("a < b", string, string).cmp'
解决方法是删除 @safe
,或将其替换为 @trusted
。
注意这个问题在DMD的开发版中没有出现,所以应该会在2.067.0中修复。