2017-06-03 38 views
1

我有一个函数返回一个特征的引用(trait_ref()),另一个函数引用一个通用特征实现(take_trait_ref_generic)。为什么在泛型函数中对特征的引用必须实现`Sized`?

但是,无法将从第一个函数获得的引用传递给第二个函数。 Rustc抱怨说“std::marker::Sized的特性不适用于SomeTrait”。

即使这是真的,为什么它必须实施Sized?无论如何这是一个参考。

trait SomeTrait {} 

struct TraitImpl; 

impl SomeTrait for TraitImpl {} 

struct Container { 
    trait_impl: TraitImpl, 
} 

impl Container { 
    fn trait_ref(&self) -> &SomeTrait { 
     &self.trait_impl 
    } 
} 

fn take_trait_ref_generic<T: SomeTrait>(generic_trait_ref: &T) {} 

fn main() { 
    let container = Container { trait_impl: TraitImpl }; 

    /*Not possible*/ 
    take_trait_ref_generic(container.trait_ref()); 
} 

回答

4

默认情况下,所有通用类型上的功能隐含有约束Sized,不管他们是如何使用的。您需要使用?Sized明确选择退出该要求:

fn take_trait_ref_generic<T>(generic_trait_ref: &T) 
where 
    T: ?Sized + SomeTrait 
{} 
相关问题