У меня есть следующий код:
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
он терпит неудачу с кучей ошибок времени жизни. Кажется, что существование GT
не должно влиять на время жизни ни dyn T
, ни T::AT
(потому что он в них не используется), но, очевидно, влияет. Точно так же время жизни dyn T
не должно зависеть от времени жизни GT
или AT
, но очевидно, что это так.
Я что-то упускаю или это проблема вывода на всю жизнь?