2015-09-13 10 views
12

構造体にピストンテクスチャを格納しようとしています。私は実際にこれが何であるかの種類を気にしない ジェネリック構造体のコンストラクタの "Expected type parameter"エラー

gfx_device_gl::Resourcesimplements gfx::Resources

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`) 
はかかわらず、私はそう知っている必要があります(私はそれだけで、デバイス固有の実装だと思います。):

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

これはコンパイルされません。私はそれを構造体に格納することができます。

私はcompilable repo on Githubを作った。

(。私はRust generics/traits: "expected 'Foo<B>', found 'Foo<Foo2>'"が同じ質問ですが、私は私の問題に適用する方法を見つけ出すことができない疑いがある)

+0

可能な複製http://stackoverflow.com/questions/31490913/rust-generics-expected-t-found-fooまたはhttp://stackoverflow.com/questions/31060851/generics-error-expected-type- parameter-found-struct – Shepmaster

+0

[trait objects](http://doc.rust-lang.org/book/trait-objects.html)を使用して、コードに含まれる多様性を達成することができます。 – cheme

答えて

18

ここにあなたのエラーの再現だ:

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を作成します」と言います。実際の実装では具体的なタイプ - この例ではboolを選択します。 Tboolであるという保証はありません。 new関数では、T型のパラメータも受け付けていないことに注意してください。呼び出し元が具体的な型の99%をどのように選択するかは疑いがありません。あなたはおそらく、あなたの構造体がジェネリックにしようとしているかのように見えるよう、newより具体的な名前を選択しますが、これを言っの

正しい方法は

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

だろう。恐らく、異なるタイプの他のコンストラクタがあるでしょう。あなたの正確なコードの場合

は、おそらくもちろん

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

ような何かをしたい、別の可能な解決策は、あなたの構造体からジェネリック型パラメータを削除することです。 gfx_device_gl::Resourcesでそれを構成するだけの場合は、それを汎用化する理由はありません。

+0

ありがとうございます!私は「インプット」で物事を「専門化」することができないことを理解していませんでした。 –

関連する問題