我是Rust的新手,並且看到一些使用Box的人可以將許多實現特定特質的類型推送到Vec上。在使用泛型特性時,我遇到了一個問題。使用特質作爲Vec類型
error[E0038]: the trait `collision::collision_detection::Collidable` cannot be made into an object
--> src/collision/collision_detection.rs:19:5
|
19 | collidables: Vec<Box<Collidable<P, M>>>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `collision::collision_detection::Collidable` cannot be made into an object
|
= note: method `get_ncollide_shape` has generic type parameters
error: aborting due to previous error
error: Could not compile `game_proto`.
To learn more, run the command again with --verbose.
這裏是我的代碼
extern crate ncollide;
extern crate nalgebra as na;
use self::ncollide::shape::Shape;
use self::ncollide::math::Point;
use self::ncollide::math::Isometry;
use self::na::Isometry2;
pub trait Collidable<P: Point, M> {
fn get_ncollide_shape<T: Shape<P, M>>(&self) -> Box<T>;
fn get_isometry(&self) -> Isometry2<f64>;
}
pub struct CollisionRegistry<P, M>
where
P: Point,
M: Isometry<P>,
{
collidables: Vec<Box<Collidable<P, M>>>,
}
impl<P: Point, M: Isometry<P>> CollisionRegistry<P, M> {
pub fn new() -> Self {
let objs: Vec<Box<Collidable<P, M>>> = Vec::new();
CollisionRegistry { collidables: objs }
}
pub fn register<D>(&mut self, obj: Box<D>)
where
D: Collidable<P, M>,
{
self.collidables.push(obj);
}
}
我試圖用collidables作爲異質遊戲的對象,這將使我ncollide兼容形狀回送入碰撞檢測引擎的列表。編輯: 清除一些混淆。我不想構造並返回特質的實例。我只是想創建一個Vec,讓任何Collidable特性的實例都被推到它上面。
的可能的複製[爲什麼一個特點不是構建自己?(https://stackoverflow.com/questions/38159771/why-can-a-trait-not-construct-itself)可能有更好的重複,但類似。 – loganfsmyth
@loganfsmyth這不是我想要做的。我已經通過大部分的類似於此的例子閱讀並已經得到了他們通過使用VEC>工作。但是當我使用的是有一個通用型像VEC >>性狀,突然我得到這個錯誤。 –
你期待'get_ncollide_shape'做什麼?這個錯誤是因爲'箱<可碰撞
>'意味着,基本上你已經刪除有關除了它實現了特質的對象的所有數據。在這種情況下,'FN get_ncollide_shape>(個體經營) - >箱;'沒有任何意義,因爲就沒有辦法來調用它。有該功能的版本無限多的,因爲它是'T'參數,所以沒有辦法使用該功能,因爲它需要在運行時決定調用哪個版本,並且選項是已知的。 –
loganfsmyth