无法从 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());
}
}
我有一个特征 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());
}
}