You can make a trait with a generic type parameter and take that as an argument (then implement it multiple times). But it would be unidiomatic, so I suggest you don't do that. Try to figure out what would be idiomatic in Rust for your use case (vs. C++). (Option<i32> maybe? Or different methods.)
You cannot overload methods defined on a struct, but you can do some kind of overloading by defining the two methods on separate traits and implementing both traits for the struct. Whether that makes sense depends on your actual use case.
There are a few common patterns for supporting calling a method with different arguments:
Make method arguments enums (eg. fn bar(i: Option<i32>))
Add methods with different names to the trait. Some of these might be convenience methods that have default implementations which forward to the "main" method that supports all the arguments.
Make method arguments generic. For example the signature of File::open is fn open<P: AsRef<Path>>(path: P) -> Result<File>. This allows the open method to accept a path in various formats (String, str, Path) which are internally all converted to a common format.
A downside of approach (3) is that such methods will no longer be available on dyn Trait objects, for the same reason that virtual methods cannot be templates in C++.