Error de “parámetro de tipo esperado” en el constructor de una estructura genérica

Estoy tratando de almacenar texturas de pistón en una estructura.

struct TextureFactory where R: gfx::Resources { block_textures: Vec<Rc<Texture>>, } impl TextureFactory 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, } } } 

Esto no comstack:

 src/main.rs:37:9: 39:10 error: mismatched types: expected `TextureFactory`, found `TextureFactory` (expected type parameter, found enum `gfx_device_gl::Resources`) 

gfx_device_gl::Resources implementa gfx::Resources though (creo que es solo la implementación específica del dispositivo). Realmente no me importa de qué tipo es esto, pero necesito saberlo para poder almacenarlo en la estructura.

Hice un informe comstackble sobre Github .

(Sospecho que los generics / rasgos de Rust: “esperado” Foo ‘, encontrado’ Foo ‘” es la misma pregunta, pero no puedo encontrar la forma de aplicarlo a mi problema).

Aquí hay una reproducción de tu error:

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

El problema surge porque trataste de mentirle al comstackdor. Este código:

 impl Foo { fn new() -> Self {} } 

Dice “Por lo que elija la persona que llama, crearé un Foo con ese tipo”. Entonces, su implementación real elige un tipo concreto : en el ejemplo, un bool . No hay garantía de que T sea ​​un bool . Tenga en cuenta que su new función ni siquiera acepta ningún parámetro de tipo T , que es altamente sospechoso ya que así es como la persona que llama selecciona el tipo concreto el 99% del tiempo.

La forma correcta de decir esto sería

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

Aunque probablemente desee elegir un nombre más específico que new , ya que parece que está tratando de hacer que su estructura sea genérica. Presumiblemente habría otros constructores con diferentes tipos.

Para su código exacto, es probable que desee algo así como

 impl TextureFactory { ... } 

Por supuesto, otra solución posible sería eliminar el parámetro de tipo genérico de su estructura. Si solo lo construyes con un gfx_device_gl::Resources , entonces no hay razón para hacerlo genérico.