如何告诉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
中找不到方法”