亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

泛型結構構造函數中的“預期類型參數”錯誤

泛型結構構造函數中的“預期類型參數”錯誤

莫回無 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 關注
  • 501 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號