use std::fmt::Debug;
#[derive(Debug)]
struct Node<K: Debug, V: Debug> {
key: K,
value: V,
}
fn myprint<K: Debug + ?Sized, V: Debug + ?Sized>(node: &Node<K,V>) -> String {
return format!("{:?}: {:?}", node.key, node.value);
}
fn main() {
let node = Node{key: "xxx", value: "yyy"};
myprint(&node);
}
compile error:
error[E0277]: the size for values of type `K` cannot be known at compilation time
--> src/main.rs:22:50
|
17 | struct Node<K: Debug,V: Debug> {
| - required by this bound in `Node`
...
22 | fn myprint<K:Debug+?Sized, V:Debug+?Sized>(node: &Node<K,V>) -> String {
| - ^^^^^^^^^^ doesn't have a size known at compile-time
| |
| this type parameter needs to be `std::marker::Sized`
But the following code works:
use std::fmt::Debug;
fn debug<T: Debug + ?Sized>(t: &T) { // T: Debug + ?Sized
println!("{:?}", t);
}
fn main() {
debug("my str"); // T = str, str: Debug + ?Sized ✔️
}
All type parameters are implicitly Sized.
That means that struct Node<K: Debug, V: Debug> {...} is the same as struct Node<K: Debug + Sized, V: Debug + Sized> {...}.
In order to allow the Sized bound to be removed, a special syntax ?Sized was added. This means that a type parameter is optionally not Sized.
In function myprint<K:Debug + ?Sized, V:Debug + ?Sized>, you were allowing K to be not Sized. Meanwhile, K in Node<K,V> must be Sized. This means that there are type parameters which myprint allows but which will cannot be compiled.
The exact same problem also applies to V.
how to resolve this problem
Well, the first question is do you need to support ?Sized as a K or V in a Node? If not, your function doesn't need to support it either.
fn myprint<K: Debug, V: Debug>(node: &Node<K,V>) {...}
If on the other hand you plan to support ?Sized K/V, you need to define your struct correctly:
struct Node<K: Debug + ?Sized, V: Debug + ?Sized> {...}
but fn debug<T: Debug+?Sized>(t: &T) can works!
Yep. That is a valid signature. The reason it doesn't work in the other function is the other function says K, a type defined as Debug + ?Sized needs to be used in Node<K, V> which is a Debug + Sized (no question mark) context.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With