Errore “parametro tipo previsto” nel costruttore di una struttura generica

Sto cercando di immagazzinare trame di pistoni in una struttura.

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, } } } 

Questo non viene compilato:

 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 implementano comunque gfx_device_gl::Resources (penso che sia solo l’implementazione specifica del dispositivo.) Non mi interessa davvero di che tipo si tratta, ma ho bisogno di sapere in modo che possa memorizzarlo nella struttura.

Ho effettuato un repo compilabile su Github .

(Sospetto i generici / tratti di Ruggine: “atteso ‘Foo ‘, trovato ‘Foo ‘” è la stessa domanda, ma non riesco a capire come applicarlo al mio problema.)

Ecco una riproduzione del tuo errore:

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

Il problema sorge perché hai provato a mentire al compilatore. Questo codice:

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

Dice “Per qualsiasi cosa scelga il chiamante, creerò un Foo con quel tipo”. Quindi la tua effettiva implementazione prende un tipo concreto – nell’esempio, un bool . Non c’è alcuna garanzia che T sia un bool . Nota che la tua new funzione non accetta nemmeno alcun parametro di tipo T , il che è altamente sospetto in quanto è così che il chiamante sceglie il tipo concreto il 99% delle volte.

Il modo corretto per dire questo sarebbe

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

Sebbene tu voglia scegliere un nome più specifico del new , sembra che tu stia cercando di rendere generica la tua struct. Presumibilmente ci sarebbero altri costruttori con tipi diversi.

Per il tuo codice esatto, probabilmente vorresti qualcosa di simile

 impl TextureFactory { ... } 

Ovviamente, un’altra ansible soluzione sarebbe rimuovere il parametro di tipo generico dalla propria struct. Se lo costruisci solo con gfx_device_gl::Resources , non c’è motivo di renderlo generico.