我有以下代码:
trait T<GT> {
type AT;
fn foo(&self);
}
struct AbstractT<GT, AT> {
t: Box<dyn T<GT, AT = AT>>,
}
impl<GT, AT> T<GT> for AbstractT<GT, AT> {
type AT = AT;
fn foo(&self) {
self.t.foo();
}
}
fn boxed_abstract<GT, TT: T<GT> + 'static>(tt: TT) -> Box<dyn T<GT, AT = TT::AT>> {
Box::new(AbstractT { t: Box::new(tt) })
}
这会引发这些错误:
error[E0310]: the associated type `<TT as T<GT>>::AT` may not live long enough
--> src/lib.rs:20:5
|
20 | Box::new(AbstractT { t: Box::new(tt) })
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<TT as T<GT>>::AT: 'static`...
note: ...so that the type `AbstractT<GT, <TT as T<GT>>::AT>` will meet its required lifetime bounds
--> src/lib.rs:20:5
|
20 | Box::new(AbstractT { t: Box::new(tt) })
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0310]: the parameter type `GT` may not live long enough
--> src/lib.rs:20:5
|
19 | fn boxed_abstract<GT, TT: T<GT> + 'static>(tt: TT) -> Box<dyn T<GT, AT = TT::AT>> {
| -- help: consider adding an explicit lifetime bound...: `GT: 'static`
20 | Box::new(AbstractT { t: Box::new(tt) })
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: ...so that the type `AbstractT<GT, <TT as T<GT>>::AT>` will meet its required lifetime bounds
--> src/lib.rs:20:5
|
20 | Box::new(AbstractT { t: Box::new(tt) })
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果我GT
从任何地方删除,它编译得很好,但GT
它会因一堆生命周期错误而失败。似乎 of 的存在不GT
应该影响dyn T
orT::AT
的生命周期(因为它没有在其中使用),但显然确实如此。同样,生命周期不dyn T
应该依赖于生命周期,GT
但AT
它显然确实如此。
我错过了什么还是终身推理问题?