2014-12-17 1 views
2

구조체가 있고 Vector의 형식에 특성 제한이있는 Vec 멤버가 필요합니다.특성 제한이있는 모든 형식의 벡터 구성

pub trait SomeTrait { 
    fn some_function(&self); 
} 

pub struct SomeStruct<T: SomeTrait> { 
    member: Vec<T> 
} 

impl<T: SomeTrait> SomeStruct<T> { 
    pub fn new() -> SomeStruct<T> { 
     SomeStruct { 
      member: Vec::new() 
     } 
    } 
} 

fn main() { 
    let mut some_struct = SomeStruct::new(); 
} 

을 그리고 컴파일러는 나에게주고있다 : 바로 지금,이 내가 노력하고 무엇에 걸쳐 있지만, 단지 심지어 낯선 컴파일러 오류를 받고 다양한 장소에서

error: the trait 'sometrait::SomeTrait' is not implemented for the type '_' 
let mut some_struct = SomeStruct::new(); 
         ^~~~~~~~~~~ 
note: required by 'somestruct::SomeStruct<T>::new' 
let mut some_struct = SomeStruct::new(); 
         ^~~~~~~~~~~ 

내가 배치 해봤 <T: SomeTrait>, 그러한 시도는 근본적으로 벗어나야합니다.

미리 도움을 청하십시오!

+0

impl은 some_function을 구현해야합니까? (와일드 추측.) –

+0

내가 이해하는 바로는,'some_struct.member' 벡터의 요소는'some_function'을 구현할 필요가 있습니다. 반드시 구조체 일 필요는 없습니다. 적어도, 그것이 내가 지향하는 것입니다 ... 그러나 구문이 무엇인지 전혀 모르겠습니다. – nathansizemore

답변

2

문제는 컴파일러가 T이 무엇인지 파악할 수있는 충분한 정보를 제공하지 않았기 때문입니다. 이것이 _의 목적입니다 : 매개 변수를 SomeStruct으로 추론해야합니다.

또한이 예제에는 SomeTrait을 구현하는 유형이 없습니다. 위의 두 가지 문제를 모두 해결하면 다음과 같이 작동합니다 (경고와 함께) :

pub trait SomeTrait { 
    fn some_function(&self); 
} 

pub struct SomeStruct<T: SomeTrait> { 
    member: Vec<T> 
} 

impl<T: SomeTrait> SomeStruct<T> { 
    pub fn new() -> SomeStruct<T> { 
     SomeStruct { 
      member: Vec::new() 
     } 
    } 
} 

impl SomeTrait for i32 { 
    fn some_function(&self) {} 
} 

fn main() { 
    let mut some_struct_a: SomeStruct<i32> = SomeStruct::new(); 
    let mut some_struct_b = SomeStruct::<i32>::new(); 
} 
+0

'some_struct.member' 벡터에'i32' 유형 만있는 것을 제한하지 않습니까? 현재 'SomeTrait'를 구현하는 유일한 유형이기 때문에? – nathansizemore

+1

녹이 동적으로 입력되지 않습니다. 'SomeStruct'는 여러 타입의 값을 지원할 수 없다는 것을 의미합니다. 또한'SomeTrait'를 구현하지 않으면 타입을'T'로 사용할 수 없으므로,이 경우에 당신의 관심사가 무엇인지 확신 할 수 없습니다. 'Vec'에서 다른 타입의 값을 지원하고 싶다면, 어떤 종류의 간접적 인 지시 ('Box','Rc','&'등)를 사용하여 살펴볼 필요가 있습니다. –

+0

그건'struct' 및'impl' 섹션을 작성하여'member'가'SomeTrait'를 구현 한 모든 유형의 Vec을 표현할 수있는 방법이 있다면 명확성을 요구하려고했던 것입니다. 옵션일지도 모르는 생각이지만, 나는 생각하지 않는다. – nathansizemore