泛型结构构造函数中的“预期类型参数”错误

泛型结构构造函数中的“预期类型参数”错误

我试图存储活塞纹理在一个结构。

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不过(我认为这只是设备特定的实现)。我并不关心这是什么类型,但我需要知道,这样我才能将它存储在结构中。

我做了一个GUUTUB上的可编译回购.

(我怀疑锈病泛型/性状:“预期‘foo<B>’,发现‘foo<foo 2>’”是同一个问题,但我想不出如何把它应用到我的问题上。)


莫回无
浏览 461回答 1
1回答

白板的微信

以下是您错误的再现:struct&nbsp;Foo<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;val:&nbsp;T,}impl<T>&nbsp;Foo<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;new()&nbsp;->&nbsp;Self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;{&nbsp;val:&nbsp;true&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}fn&nbsp;main()&nbsp;{}问题的出现是因为你试图欺骗编译器。此代码:impl<T>&nbsp;Foo<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;new()&nbsp;->&nbsp;Self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;...&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;}}说“为了什么T这个打电话者选择,我将创建一个Foo然后您的实际实现将选择一个混凝土类型-在本例中,abool..不能保证T是bool..注意你的new函数甚至不接受任何类型的参数T,这是非常可疑的,因为调用者在99%的时间内都是这样选择具体类型的。正确的说法是impl&nbsp;Foo<bool>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;new()&nbsp;->&nbsp;Self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;{&nbsp;val:&nbsp;true&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}虽然您可能想选择一个比new,就像您试图使您的struct成为通用的一样。想必会有其他不同类型的构造函数。对于您的确切代码,您可能希望类似于impl&nbsp;TextureFactory<gfx_device_gl::Resources>&nbsp;{&nbsp;/*&nbsp;...&nbsp;*/&nbsp;}另一个可能的解决方案是从结构中删除泛型类型参数。如果您只使用gfx_device_gl::Resources,那就没有理由让它成为通用的了。在其他情况下,您可能试图返回实现某一特性的类型。为此,可以使用盒式特征对象:impl&nbsp;Foo<Box<dyn&nbsp;std::fmt::Display>>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;new()&nbsp;->&nbsp;Self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;{&nbsp;val:&nbsp;Box::new(true)&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}在将来,您也可以使用impl Trait(a.k.a.存在类型):#![feature(existential_type)]struct&nbsp;Foo<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;val:&nbsp;T,}existential&nbsp;type&nbsp;D:&nbsp;std::fmt::Display;impl&nbsp;Foo<D>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;new()&nbsp;->&nbsp;Self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;{&nbsp;val:&nbsp;true&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}另见:返回Iterator(或任何其他特性)的正确方法是什么?
打开App,查看更多内容
随时随地看视频慕课网APP