我创建了一个最小的例子来说明我无法解决的类型推断问题。
trait A<'a> {
type Item: Copy;
type Iter: Iterator<Item=Self::Item>;
fn items(&'a self) -> Self::Iter;
fn consume(&'a self, i: Self::Item) -> Self::Item;
fn f(&'a self) {
let _ = self.items().map(|i| self.consume(i) as Self::Item);
}
}
编译器错误是
x.rs:10:30: 10:68 error: type annotations required: cannot resolve `<<Self as A<'_>>::Iter as core::iter::Iterator>::Item == _` [E0284]
x.rs:10 let _ = self.items().map(|i| self.consume(i) as Self::Item);
我已经查看了有关要求类型注释的其他问题,但这似乎是涉及相关类型的特殊情况。
答案 0 :(得分:6)
我认为这是#24338,并且是由于编译器对特征中的生命周期和相关类型感到困惑所致。它可以通过将f
方法的主体移动到一个单独的函数中来解决(嵌套计数是单独的,因为它们是独立的类型检查):
trait A<'a> {
// ...
fn f(&'a self) {
f_body(self);
fn f_body<'a, T: ?Sized + A<'a>>(x: &'a T) {
let _ = x.items().map(|i| x.consume(i) as T::Item);
}
}
}