Your are missing the fact that when T : ?Sized + Greet, you don't automagically have Box<T> : Greet (including, although unrelated here, that Box<dyn Trait> does not impl Trait, even though dyn Trait does. In practice, since Box : Deref, you can call methods from the inner value on a boxed thing, since the . operator can implicitly dereference, but that fact is just syntactic sugar: we don't get a magical impl on it (the most known counter example would be that Box<impl Future> is not always Future, an added Unpin bound is required for that to work)).
But in most cases, explicitely adding such an impl is trivial, and does "solve" this kind of issues:
impl<T : Greet> Greet for Box<T> {
fn greet (self: &'_ Box<T>) -> &'static str
{
#![deny(unconditional_recursion)] // to prevent mistakes
(&**self).greet()
// or `T::greet(self)`
}
}
This way, impl<T: Greet + 'static> From<T> for Box<dyn Greet> can kick in for the case where type T = Box<impl Greet>, such as type T = Box<Hello>.