为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

莫回无 2019-07-03 17:44:17
泛型结构构造函数中的“预期类型参数”错误我试图存储活塞纹理在一个结构。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>’”是同一个问题,但我想不出如何把它应用到我的问题上。)
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

以下是您错误的再现:

struct Foo<T> {
    val: T,}impl<T> Foo<T> {
    fn new() -> Self {
        Foo { val: true }
    }}fn main() {}

问题的出现是因为你试图欺骗编译器。此代码:

impl<T> Foo<T> {
    fn new() -> Self {
        /* ... */
    }}

说“为了什么T这个打电话者选择,我将创建一个Foo然后您的实际实现将选择一个混凝土类型-在本例中,abool..不能保证Tbool..注意你的new函数甚至不接受任何类型的参数T,这是非常可疑的,因为调用者在99%的时间内都是这样选择具体类型的。

正确的说法是

impl Foo<bool> {
    fn new() -> Self {
        Foo { val: true }
    }}

虽然您可能想选择一个比new,就像您试图使您的struct成为通用的一样。想必会有其他不同类型的构造函数。

对于您的确切代码,您可能希望类似于

impl TextureFactory<gfx_device_gl::Resources> { /* ... */ }

另一个可能的解决方案是从结构中删除泛型类型参数。如果您只使用gfx_device_gl::Resources,那就没有理由让它成为通用的了。

在其他情况下,您可能试图返回实现某一特性的类型。为此,可以使用盒式特征对象:

impl Foo<Box<dyn std::fmt::Display>> {
    fn new() -> Self {
        Foo { val: Box::new(true) }
    }}

在将来,您也可以使用impl Trait(a.k.a.存在类型):

#![feature(existential_type)]struct Foo<T> {
    val: T,}existential type D: std::fmt::Display;impl Foo<D> {
    fn new() -> Self {
        Foo { val: true }
    }}

另见:


查看完整回答
反对 回复 2019-07-03
  • 1 回答
  • 0 关注
  • 460 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信