无法从 impl<T: X> 调用 fn<T: X> 因为 X 不满足 T

Cannot call a fn<T: X> from an impl<T: X> because X is not satisfied for T

我有一个特征 RawFd 为满足特殊要求的每种类型实现。

现在我有一个函数可以接受任何实现 RawFd 的类型。我有一个特征,每个 T 都有一个实现 RawFd.

然而,即使 T 实现了 RawFd:

,我也无法从我的特征中调用我的函数
pub trait RawFd {
    fn raw_fd(&self) -> u64;
}

#[cfg(unix)]
impl<T: std::os::unix::io::AsRawFd> RawFd for T {
    fn raw_fd(&self) -> u64 { self.as_raw_fd() as u64 }
}

#[cfg(windows)]
impl<T: std::os::windows::io::AsRawSocket> RawFd for T {
    fn raw_fd(&self) -> u64 { self.as_raw_socket() as u64 }
} 

fn print_fd<T: RawFd>(p: T) {
    println!("{}", p.raw_fd());
}

trait Printable {
    fn print(&self);
}

impl<T: RawFd> Printable for T {
    fn print(&self) {
        print_fd(self);
    }
}

我这里的错误是什么,我该如何解决。

(Link 到 playground)

如果您希望将 print_fd() 与参考一起使用,您必须这样做:

fn print_fd(p: &impl RawFd) {
    println!("{}", p.raw_fd());
}

fn print_fd<T: RawFd>(p: &T) {
    println!("{}", p.raw_fd());
}

或者你必须以自我为价值:

impl<T: RawFd> Printable for T {
    fn print(self) {
        print_fd(self);
    }
}

或者您可以使用克隆:

impl<T> Printable for T where T: Clone + RawFd {
    fn print(&self) {
        print_fd(self.clone());
    }
}