我有一个结构Roll<K : Copy + PartialEq, V : Clone, const N : usize>
,然后我这样做:
struct Foo;
impl<K : Copy + PartialEq, V : Clone, const N : usize> Foo {
type Value = Roll<K, V, N>;
fn bar(self) {
let mut x : Self::Value = Roll::new();
x.insert(1, 1);
}
}
我得到了:
error[E0207]: the type parameter `K` is not constrained by the impl trait, self type, or predicates
--> src/foo.rs:3:6
|
3 | impl<K : Copy + PartialEq, V : Clone, const N : usize> Foo {
| ^ unconstrained type parameter
这意味着什么以及如何修复?
1条答案
按热度按时间3pvhb19x1#
你要求Rust为每个类型
K
,V
和N
生成一个bar
方法,而没有任何方法来区分调用哪个bar
。Rust不允许这样做。如果你做了Foo.bar()
,你如何告诉Rust使用哪些泛型类型?如果你有
fn bar<K,V,N>()
,你可以做Foo.bar::<K,V,N>()
。如果Foo
是泛型的,你可以做Foo::<K,V,N>.bar()
。如果你正在实现一个trait,你可以做<Foo as MyTrait<K,V,N>>.bar()
。但是如果你的impl
被允许,你就没有办法告诉Rust使用什么类型。像这样的关联类型在非trait的
impl
块上没有多大意义。使bar
成为泛型,并让它在Roll
而不是Self::Value
上操作。