generics结构的构造函数中的“期望types参数”错误
我正在尝试将活塞纹理存储在结构中。
struct TextureFactory<R> where R: gfx::Resources { block_textures: Vec<Rc<Texture<R>>>, } impl<R> TextureFactory<R> where R: gfx::Resources { fn new(window: PistonWindow) -> Self { let texture = Rc::new(gfx_texture::Texture::from_path( &mut *window.factory.borrow_mut(), "assets/element_red_square.png", Flip::None, &TextureSettings::new() ).unwrap()); let block_textures = Vec::new(); block_textures.push(texture); TextureFactory { block_textures: block_textures, } } }
这不会编译:
src/main.rs:37:9: 39:10 error: mismatched types: expected `TextureFactory<R>`, found `TextureFactory<gfx_device_gl::Resources>` (expected type parameter, found enum `gfx_device_gl::Resources`)
gfx_device_gl::Resources
实现gfx::Resources
(虽然我认为这只是设备特定的实现)。我并不关心这是什么types,但我需要知道,以便我可以将其存储在结构中。
我在Github上做了一个可编译的回购 。
(我怀疑Rust的generics/特征:“预计'Foo B'',发现'Foo <Foo2>''是同一个问题,但我不知道如何将它应用于我的问题。
这里是你的错误的复制:
struct Foo<T> { val: T, } impl<T> Foo<T> { fn new() -> Self { Foo { val: true } } } fn main() { }
问题出现是因为你试图对编译器说谎。 此代码:
impl<T> Foo<T> { fn new() -> Self {} }
说:“无论调用者select什么,我都会创build一个这种types的Foo
”。 然后你的实际实现select一个具体的types – 在这个例子中,一个bool
。 T
不能保证T
是一个bool
。 请注意,你的new
函数甚至不接受T
types的任何参数,这是非常值得怀疑的,因为调用者如何在99%的时间内select具体types。
说这个的正确方法是
impl Foo<bool> { fn new() -> Self { Foo { val: true } } }
虽然你可能想要select一个比new
的更具体的名字,因为它看起来好像你试图使你的结构通用。 大概会有其他types的构造函数。
为了确切的代码,你可能想要的东西
impl TextureFactory<gfx_device_gl::Resources> { ... }
当然,另一个可能的解决scheme是从您的结构中删除genericstypes参数。 如果你只是用gfx_device_gl::Resources
构造它,那么没有理由使它成为通用的。