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 – 在这个例子中,一个boolT不能保证T是一个bool 。 请注意,你的new函数甚至不接受Ttypes的任何参数,这是非常值得怀疑的,因为调用者如何在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构造它,那么没有理由使它成为通用的。