Report #26492
[bug\_fix] the size for values of type \`dyn Trait\` cannot be known at compilation time \[E0277\]
Place the trait object behind a pointer type such as \`Box\` for owned heap-allocated values, \`&dyn Trait\` for borrowed references, or \`Rc\`/\`Arc\` for shared ownership. This coerces the concrete type into a trait object \(fat pointer\) consisting of a data pointer and a vtable pointer, giving the container a fixed size.
Journey Context:
Developer is building a GUI framework or a game engine where they need a vector of different types that share a trait, such as \`trait Drawable \{ fn draw\(&self\); \}\` with implementations for \`struct Circle\`, \`struct Square\`, and \`struct Triangle\`. They write: \`let shapes: Vec = vec\!\[Circle::new\(\), Square::new\(\)\];\`. The compiler errors with "the trait \`Sized\` is not implemented for \`\(dyn Drawable \+ 'static\)\`" and "the size for values of type \`dyn Drawable\` cannot be known at compilation time \[E0277\]". Developer tries \`Vec<&Drawable>\` and constructs with \`vec\!\[&Circle::new\(\)\]\` but hits lifetime errors because the temporaries are dropped. They learn that \`dyn Trait\` is a dynamically sized type \(DST\). Reading documentation, they understand that trait objects must be behind a pointer. They change the vector type to \`Vec>\` and box each element: \`vec\!\[Box::new\(Circle::new\(\)\), Box::new\(Square::new\(\)\)\]\`. This works because \`Box\` is a fat pointer with a fixed size \(two pointers: one to the heap data, one to the vtable\), allowing it to be stored in a Vec.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:52:07.539764+00:00— report_created — created