我相信以下代碼是有道理的:
trait FooConst<const N: usize> {}
trait Foo {}
impl<T: FooConst<N>, const N: usize> Foo for T {}
但是,當我嘗試編譯它時,我收到錯誤 E0207,指出該引數N是無界的。我不明白為什么,因為在我看來它是T.
游樂場鏈接
uj5u.com熱心網友回復:
不允許這樣做的根本原因是因為 trait bound 可能會導致同一型別的多個 trait 實作。
例如,考慮一個Bar同時實作FooConst<1>and的型別FooConst<2>,這完全沒問題:
struct Bar;
impl FooConst<1> for Bar {}
impl FooConst<2> for Bar {}
如果Foo為所有人實作T: FooConst<N>,那么我們得到兩種 Foo實作Bar:一種用于N == 1和一種用于N == 2。Rust 不允許有多個 trait 實作,這就是為什么它不允許以這種方式使用型別引數。
解決此問題的一種方法是創建N一個關聯的常量:
trait FooConst {
const N: usize;
}
trait Foo {}
impl<T: FooConst> Foo for T {
// T::N is an associated constant
}
uj5u.com熱心網友回復:
好的,所以我不完全知道為什么這會在您的代碼不起作用時起作用,但是這里有一個代碼可以滿足您的要求:
trait FooConst<const N: usize> {}
trait Foo {}
impl<const N: usize> Foo for dyn FooConst<N> {}
如果您知道為什么會這樣,請隨時發表評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363426.html
