什么是特性`core :: types :: Sized`没有实现类型`<generic#0 =“”>`生锈?</generic>

时间:2014-09-26 15:17:51

标签: rust

我希望这可行:

trait Task<R, E> {
  fn run(&self) -> Result<R, E>;
}

mod test {

  use super::Task;

  struct Foo;
  impl<uint, uint> Task<uint, uint> for Foo {
    fn run(&self) -> Result<uint, uint> {
      return Err(0);
    }
  }

  fn can_have_task_trait() {
    Foo;
  }
}

fn main() {
  test::can_have_task_trait();
}

......但它没有:

<anon>:10:3: 14:4 error: the trait `core::kinds::Sized` is not implemented for the type `<generic #0>`
<anon>:10   impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11     fn run(&self) -> Result<uint, uint> {
<anon>:12       return Err(0);
<anon>:13     }
<anon>:14   }
<anon>:10:3: 14:4 note: the trait `core::kinds::Sized` must be implemented because it is required by `Task`
<anon>:10   impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11     fn run(&self) -> Result<uint, uint> {
<anon>:12       return Err(0);
<anon>:13     }
<anon>:14   }
<anon>:10:3: 14:4 error: the trait `core::kinds::Sized` is not implemented for the type `<generic #1>`
<anon>:10   impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11     fn run(&self) -> Result<uint, uint> {
<anon>:12       return Err(0);
<anon>:13     }
<anon>:14   }
<anon>:10:3: 14:4 note: the trait `core::kinds::Sized` must be implemented because it is required by `Task`
<anon>:10   impl<uint, uint> Task<uint, uint> for Foo {
<anon>:11     fn run(&self) -> Result<uint, uint> {
<anon>:12       return Err(0);
<anon>:13     }
<anon>:14   }
error: aborting due to 2 previous errors
playpen: application terminated with error code 101
Program ended.

围栏:http://is.gd/kxDt0P

那么,发生了什么?

我不知道这个错误意味着什么。

我是否正在使用Result并且要求U,V不是大小的?在哪种情况下,为什么它们大小?我没写:

Task<Sized? R, Sized? E>

现在所有仿制药都是动态尺寸还是什么? (在这种情况下,什么是大小?甚至是什么意思?)

发生了什么事?

2 个答案:

答案 0 :(得分:5)

您只需删除<uint, uint>中的impl<uint, uint>,因为类型参数会在那里而不是具体类型:

impl Task<uint, uint> for Foo { ... }

我认为你得到的错误是编译器对未使用的类型参数感到困惑。它也出现在这个超级缩减版本中:

trait Tr {}
impl<X> Tr for () {}

答案 1 :(得分:2)

Rust不提供«泛型专业化»:您将特征定义为Task<R, E>,您必须使用泛型类型(RE)来实现它。

不可能只使用特定类型来实现它,就像您尝试使用<uint, uint>一样。

例如,如果你写了:

trait Foo<R> {}

struct Bar;

struct Baz;

impl<Baz> Foo<Baz> for Bar {}

你应该期望你的实现集团中的Baz与你的struct Baz相同:它被遮蔽,就像var参数一样函数会影响var个全局变量。

然而,当你用原始类型执行此操作时,却得到这个神秘的错误消息而不是简单的阴影,这个可能是一个错误,要么你应该有阴影或更清晰的错误信息。