如何告诉Rust函数'num_traits::pow::pow'已经为我的自定义trait实现了
我想创造一个特质,说它实现了 我的特质目前定义为:如何告诉Rust函数'num_traits::pow::pow'已经为我的自定义trait实现了,rust,traits,generic-programming,Rust,Traits,Generic Programming,我想创造一个特质,说它实现了 我的特质目前定义为: pub-PrimeSieveTrait: AddAssign+MulAssign+integer::Roots+FromPrimitive+TopPrimitive+PartialOrd+Copy{} 针对T的impl PRIME SIVEETRAIT 其中T: AddAssign+MulAssign+integer::Roots+FromPrimitive+TopPrimitive+PartialOrd+Copy{} 我关心的T类型是u32
pub-PrimeSieveTrait:
AddAssign+MulAssign+integer::Roots+FromPrimitive+TopPrimitive+PartialOrd+Copy{}
针对T的impl PRIME SIVEETRAIT
其中T:
AddAssign+MulAssign+integer::Roots+FromPrimitive+TopPrimitive+PartialOrd+Copy{}
我关心的T
类型是u32
和u64
,它们已经有一个.pow()
函数在处实现,并且返回u32
和u64
。如何修改trait定义以使下面的函数正常工作
fn测试用例(p:T,x:u32)->T{
设one=T::from_u8(1).unwrap();
p、 pow(x)-1
}
Rust的错误非常有用:
error[E0599]: no method named `pow` found for type parameter `T` in the current scope
--> src/common/divisor.rs:30:19
|
30 | let p_power = p.pow(x);
| ^^^ method not found in `T`
|
= help: items from traits can only be used if the type parameter is bounded by the trait
help: the following traits define an item `pow`, perhaps you need to restrict type parameter `T` with one of them:
|
26 | fn step_calc_divisors<T: rug::ops::Pow + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
| ^^^^^^^^^^^^^^^^^^
26 | fn step_calc_divisors<T: num::PrimInt + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
| ^^^^^^^^^^^^^^^^^
26 | fn step_calc_divisors<T: num::traits::Pow + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
| ^^^^^^^^^^^^^^^^^^^^^
error[E0599]:在当前作用域中找不到类型参数'T'的名为'pow'的方法
-->src/common/divisior.rs:30:19
|
30 |设p|u幂=p.pow(x);
|^T中找不到^T方法`
|
=帮助:只有当类型参数受trait约束时,才能使用traits中的项
帮助:以下特征定义了一个条目“pow”,也许您需要使用其中一个来限制类型参数“T”:
|
26 | fn阶跃计算除数(除数:&mut Vec,严格的下界:T,上界:T,p:T,x:u32){
| ^^^^^^^^^^^^^^^^^^
26 | fn阶跃计算除数(除数:&mut Vec,严格的下界:T,上界:T,p:T,x:u32){
| ^^^^^^^^^^^^^^^^^
26 | fn阶跃计算除数(除数:&mut Vec,严格的下界:T,上界:T,p:T,x:u32){
| ^^^^^^^^^^^^^^^^^^^^^
尝试第二种方法有效:
pub-PrimeSieveTrait:
AddAssign+MulAssign+DivAssign+integer::root+PrimInt+FromPrimitive{}
针对T的impl PRIME SIVEETRAIT
其中T:
AddAssign+MulAssign+DivAssign+integer::root+PrimInt+FromPrimitive{}
难道你不能将Pow
添加到你现有的特质边界中吗?@Cerberus我刚刚尝试添加Pow
,它仍然说“在t
中找不到方法”