I'm trying to push items into a VecDeque
, but I can't get my head around this bit. The compiler complains that my push_back
method in the InnerQueue
impl is a generic T
type (well, it is). How can I fix the code so I can push UserItem
s into a User
typed Queue
?
use std::collections::VecDeque;
fn main() {}
struct Queue<T: InnerQueue> {
name: String,
queue: T,
}
impl<T: InnerQueue> Queue<T> {
pub fn new(name: String) -> Queue<T> {
Queue {
name,
queue: T::new(),
}
}
pub fn push<R>(&self, data: R)
where
R: QueueItem,
{
self.queue.push_back(data);
}
}
trait QueueItem {}
type UserItem = (u32, u64, u64);
impl QueueItem for UserItem {}
trait InnerQueue {
fn new() -> Self;
fn push_back<T: QueueItem>(&mut self, data: T);
}
type User = VecDeque<UserItem>;
impl InnerQueue for User {
fn new() -> Self {
VecDeque::new()
}
fn push_back<T: QueueItem>(&mut self, data: T) {
self.push_back(data);
}
}
error[E0308]: mismatched types
--> src/main.rs:46:24
|
45 | fn push_back<T: QueueItem>(&mut self, data: T) {
| - this type parameter
46 | self.push_back(data);
| ^^^^ expected tuple, found type parameter `T`
|
= note: expected tuple `(u32, u64, u64)`
found type parameter `T`
= help: type parameters must be constrained to match other types
= note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters