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 UserItems 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
 
    