Code:
trait MyIterator: Iterator<Item = char> {}
impl<T: ?Sized + Iterator<Item=char> + 'static> MyIterator for T {}
struct TestStruct {
data: Box<MyIterator + 'static>,
}
fn new_struct(string: &'static str) -> TestStruct {
TestStruct {
data: Box::new(string.chars()) as Box<MyIterator + 'static>,
//also does not compile
//data: Box::new(string.chars()) as Box<MyIterator<Item=char> + 'static>,
}
}
fn main() {}
Error:
<anon>:11:15: 11:39 error: the value of the associated type `Item` (from the trait `core::iter::Iterator`) must be specified [E0191]
<anon>:11 data: Box::new(string.chars()) as Box<MyIterator + 'static>,
^~~~~~~~~~~~~~~~~~~~~~~~
I expect this code to compile without errors.
This is the error on the current version:
Compiling playground v0.0.1 (file:///playground)
error[E0191]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) must be specified
--> src/main.rs:6:15
|
6 | data: Box<MyIterator + 'static>,
| ^^^^^^^^^^^^^^^^^^^^ missing associated type `Item` value
error: aborting due to previous error
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
Changing line 6 to data: Box<MyIterator<Item=char> + 'static>, moves the error to line 11:
Compiling playground v0.0.1 (file:///playground)
error[E0191]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) must be specified
--> src/main.rs:11:47
|
11 | data: Box::new(string.chars()) as Box<MyIterator + 'static>,
| ^^^^^^^^^^^^^^^^^^^^ missing associated type `Item` value
error[E0308]: mismatched types
--> src/main.rs:11:15
|
11 | data: Box::new(string.chars()) as Box<MyIterator + 'static>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait `MyIterator<Item=char>`, found trait `MyIterator`
|
= note: expected type `std::boxed::Box<MyIterator<Item=char> + 'static>`
found type `std::boxed::Box<MyIterator + 'static>`
= help: here are some functions which might fulfill your needs:
- .collect()
- .product()
- .sum()
error: aborting due to 2 previous errors
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
However, commenting line 11 and uncommenting line 13 makes the code compile fine.
Very strange. I'd expect the Item=char version to compile.
(comment copied from duplicate #36978 for locality purposes, since it contains a more-M WE)
Consider the following:
trait Foo { type FooT; }
trait Bar { }
trait FooBar: Foo<FooT=usize> + Bar { }
type BoxedFooBar = Box<FooBar>;
Since the value of FooT is known from the definition of FooBar, line 4 should be fine — if FB: FooBar then necessarily FB::FooT = usize. However, this fails to compile with rustc 1.12.0, with the error:
error[E0191]: the value of the associated type `FooT` (from the trait `Foo`) must be specified
--> <anon>:4:24
|
4 | type BoxedFooBar = Box<FooBar>;
| ^^^^^^ missing associated type `FooT` value
To make it compile, one must duplicate the information at every use-site:
trait Foo { type FooT; }
trait Bar { }
trait FooBar: Foo<FooT=usize> + Bar { }
type BoxedFooBar = Box<FooBar<FooT=usize>>;
Am I looking at an example of this, or something else entirely? Playground example; that fails to compile with the same error as above in this thread.
(Note that this example contains an error on my part: I intended to use the template parameter C, and write &mut C, and not have that trait object. If I correct that, it does compile.)
Yes, this is the same thing.
Just ran into this today. As mentioned by @thanatos and in some linked duplicates, it appears to only impact trait objects. (if it impacted generic type parameters, I think there would be a lot more fuss over it!)
trait MyFunc: FnMut() {}
impl<F:FnMut()> MyFunc for F {}
// OK
fn takes_generic<F: MyFunc>(mut f: F) { f(); }
// Error: missing associated type `Output` value
fn takes_trait_object(f: &mut MyFunc) { f(); }
fn main() {}
Changing the trait object to a generic type parameter is a workaround in many, but not all, use cases.
Just ran into this bug while trying to mix Box with Stream and Sink supertraits from futures crate. Very annoying!
I ran into the same bug, in the same situation like @vorot93.
I ran into that problem too, it's quite annoying. I hope a fix will pop soon.
Any progress on this lately?
I think this issue has been resolved as of PR #55687, correct? The linked playgrounds no longer fail to compile, at least on a cursory inspection. Could we close this issue out?
Looks fixed to me.
Most helpful comment
Just ran into this bug while trying to mix
BoxwithStreamandSinksupertraits fromfuturescrate. Very annoying!