По умолчанию все переменные типа предполагаются равными Sized
.Например, в определении структуры Bar
существует неявное ограничение Sized
, например:
struct Bar<T: Sized> {
v: Rc<T>,
}
Объект dyn Foo
не может быть Sized
поскольку каждая возможная реализация Foo
может иметь разный размер, поэтому не может быть выбран один размер.Но вы пытаетесь создать экземпляр Bar<dyn Foo>
.
. Исправление заключается в отказе от черты Sized
для T
:
struct Bar<T: ?Sized> {
v: Rc<T>,
}
А также в контекстереализации:
impl<T: ?Sized> Bar<T>
where
T: Foo
?Sized
на самом деле не ограничение, а ослабление существующего ограничения Sized
, так что оно не требуется.
Последствие отказа от Sized
в том, что ни один из Bar
методов этого блока impl
не может использовать T
, кроме как по ссылке.