Der CodeUnbefriedigend Merkmal gebunden BETEILIGUNG Typ zugeordnet
pub trait Q<S> {
fn f();
}
pub trait A {
type I;
type F: Q<Self::I>;
}
// this works (1)
//
// pub struct S<T>
// where
// T: A
// {
// unsatisfied trait bound (2)
pub struct S<T>
where
T: A<I = bool>,
{
t: T,
}
zu kompilieren schlägt fehl:
error[E0277]: the trait bound `<T as A>::F: Q<bool>` is not satisfied
--> src/main.rs:18:1
|
18 |/pub struct S<T>
19 | | where
20 | | T: A<I = bool>,
21 | | {
22 | | t: T,
23 | | }
| |_^ the trait `Q<bool>` is not implemented for `<T as A>::F`
|
= help: consider adding a `where <T as A>::F: Q<bool>` bound
= note: required by `A`
Interessanterweise funktioniert es, wenn Sie die auf Kommentar Leitung (1) anstelle von (2) zu verwenden. Es funktioniert auch, wenn Sie den zugehörigen Typ I
in einen generischen Typ umwandeln (schreiben Sie trait A<I>
und A<bool>
).
impl<T> S<T>
where T: A
{
fn g() {
T::F::f()
}
}
gelingt es mit der Linie (1) oder generischem Typ I
wird so T::F : Q<bool>
in der Tat in den Fällen angenommen.
Warum wird die Eigenschaft automatisch mit Zeile (1) oder generischen Typen angenommen, aber nicht mit Zeile (2)?
Können wir den obigen Code beheben, ohne jedes Mal where T::F: Q<bool>
anzuhängen, wenn wir T: A<I=bool>
verwenden?