2015-09-13 16 views
12

Tôi đang cố gắng lưu trữ kết cấu piston trong cấu trúc.Lỗi "Tham số kiểu dự kiến" trong hàm tạo của cấu trúc chung

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

này không biên dịch:

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::Resourcesimplements gfx::Resources dù (tôi nghĩ nó chỉ là việc thực hiện thiết bị cụ thể.) Tôi không thực sự quan tâm đến những gì kiểu này, nhưng tôi cần phải biết để mà tôi có thể lưu trữ nó trong cấu trúc.

Tôi đã tạo compilable repo on Github.

(tôi nghi ngờ Rust generics/traits: "expected 'Foo<B>', found 'Foo<Foo2>'" là cùng một câu hỏi, nhưng tôi không thể tìm ra cách để áp dụng nó vào vấn đề của tôi.)

+0

Bản sao có thể có của http://stackoverflow.com/questions/31490913/rust-generics-expected-t-found-foo hoặc http://stackoverflow.com/questions/31060851/generics-error-expected-type- parameter-found-struct – Shepmaster

+0

Bạn có thể sử dụng [đối tượng trait] (http://doc.rust-lang.org/book/trait-objects.html) để đạt được loại đa hình mà mã của bạn có vẻ liên quan. – cheme

Trả lời

18

Đây là một bản tái tạo của lỗi của bạn:

struct Foo<T> { 
    val: T, 
} 

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

fn main() { 

} 

Vấn đề phát sinh bởi vì bạn đã cố gắng nói dối với trình biên dịch. Mã này:

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

Says "Đối với bất cứ điều gì T người gọi chọn, tôi sẽ tạo ra một Foo với kiểu đó". Sau đó, triển khai thực tế của bạn chọn loại bê tông - trong ví dụ, bool. Không đảm bảo rằng Tbool. Lưu ý rằng hàm new của bạn thậm chí không chấp nhận bất kỳ thông số nào thuộc loại T, điều này rất đáng nghi ngờ vì đó là cách người gọi chọn loại bê tông 99% thời gian.

Cách đúng để nói đây sẽ là

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

Mặc dù bạn có thể muốn chọn một tên cụ thể hơn new, vì nó trông như thể bạn đang cố gắng để làm cho cấu trúc của bạn chung chung. Có lẽ sẽ có các nhà thầu khác với số khác nhau là.

Đối với mã chính xác của bạn, có thể bạn muốn một cái gì đó giống như

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

Tất nhiên, một giải pháp khả thi sẽ là để loại bỏ các tham số kiểu generic từ struct của bạn. Nếu bạn chỉ bao giờ xây dựng nó với một gfx_device_gl::Resources, sau đó không có lý do để làm cho nó chung chung.

+0

cảm ơn bạn! Tôi đã không nhận ra rằng tôi có thể "chuyên" những thứ trong 'impl'. –

Các vấn đề liên quan