我有一个操作的零复制实现:
impl<'a, 'b> Add<&'b Key> for &'a Key {
type Output = Key;
fn add(self, rhs: &'b Key) -> Key {
// ... calculate sum from given references ...
Key::new(sum)
}
}
我有几个具有相似属性的结构,它们都以两个引用作为输入来实现Add
,并返回一个新值,即&'a T: Add<&'b T, Output = T>
我想编写一个通用函数,可以利用这些实现中的任何一种,但似乎没有什么可以满足借阅检查器的要求:
pub struct FixedSet<T> {
items: Vec<Option<T>>,
}
impl<T: Clone + PartialEq> FixedSet<T> {
...
pub fn sum<'a>(&self) -> Option<T>
where
T: 'a,
&'a T: Add<&'a T, Output=T>,
{
if self.items.len() == 0 {
return None
}
let mut iter = self.items.iter(); //** Error **
let mut sum = iter.next().unwrap().as_ref().unwrap().clone();
for v in iter {
let t = v.as_ref().unwrap();
sum = &sum + t; // *A*
}
Some(sum)
}
错误是:error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
。
我想 告诉编译器,“嘿,当调用add
时有两个对T
的引用时,请放心,这些引用只需要存在即可直到从add
返回 A ”;但我似乎无法正确处理。