我想使用我的自定义分配器为 std 中的容器定义类型别名,例如
type MyBox<T> = Box<T, A=MyAlloc>;
但是有人告诉我
error[E0229]: associated type bindings are not allowed here
--> src/lib.rs:12:24
|
12 | type MyBox<T> = Box<T, A=MyAlloc>;
| ^^^^^^^^^ associated type not allowed here
为什么不允许这样做,是否有一些解决方法(每晚都可以)?
默认类型始终位于 A
的泛型类型
definition上(此处缺少 - 您将
A
用作泛型类型而不定义它),而不是在使用该类型的位置。这有效:
type MyBox<T, A = MyAlloc> = Box<T, A>;
您不需要
A=
。
type MyBox<T> = Box<T, MyAlloc>;
这就是您所需要的。放置
A=
尝试在关联类型上定义约束,而不是类型参数。也就是说,在函数签名中,您可以编写
fn foobar<I>(iterator: I)
where I: Iterator<Item = u32>;
限制您的函数仅接受元素类型为
u32
的迭代器。这是因为 Iterator::Item
是在 impl
的 Iterator
内部定义的 关联类型(或更准确地说,是其实现者的
impl
),而 A
中的 Box<T, A>
是简单类型参数,因此您可以在不使用其名称的情况下引用它。
关联的类型约束在类型别名中没有意义,这就是您收到该错误的原因。