错误:'operator/'的重载不明确

2 投票
3 回答
1123 浏览
提问于 2025-04-16 01:51

我刚接触C语言,遇到了一些麻烦:

int i,j,ll,k;
double ddim,ddip,ddjm,ddjp,ddlm,ddlp;
for(i=1; i<(mx-1); i++){
for(j=1; j<(my-1); j++){
 for(ll=1; ll<(mz-1); ll++){

 ddim=0.5*k
 ddip=0.5*k
 ddjm=0.5*k
 ddjp=0.5*k
 ddlm=0.5*k
 ddlp=0.5*k

  Wijl(i,j,ll) =  ((1.0/h_x)*(ddip) \
     ((1.0/h_x)*(ddim))   \
     ((1.0/h_y)*(ddjp))   \
     ((1.0/h_y)*(ddjm))   \
     ((1.0/h_z)*(ddlp))   \
     ((1.0/h_z)*(ddlm)) ; 
          }
     }
}

我用gcc编译这个代码,使用的是python和scipy,传入所有没有初始化的变量,但我知道问题出在代码中的1.0/h_x部分。如果我用python/gcc编译一些基本的C语句,那是可以正常工作的,所以我并不是在遇到python/gcc的问题。

我收到的错误是:“错误:'operator/'的重载不明确,在'1.0e+0 / h_x'中”。

看起来它在尝试进行赋值重载,但我只想做除法而已!

任何帮助都将非常感谢!:)

谢谢,

Tyler

3 个回答

0

我强烈建议你仔细去掉那些完全多余的括号,然后认真看看剩下的部分。

比如,这段代码:

((1.0/h_x)*(ddim)*((q(i,j,ll) - q(i-1,j,ll)))/h_x)

简化后变成:

ddim * (q(i,j,ll) - q(i-1,j,ll)) / h_x / h_x

注意到原本两个 / h_x 的分开写法,让人不禁想知道最开始的意图是什么。

0

如果 h_xfloat 类型,那么当你用 1.0(默认是 double 类型)去除以它时,C语言就会搞不清楚到底是用浮点数运算还是双精度运算。

如果你想用浮点数运算,就把 1.0 改成 1.0f;如果想用双精度运算,那就把你的 h_x 声明为 double 类型,或者进行类型转换。

如果 h_xint 类型(这我最担心的),你最好在循环外面把你的 h_? 变量赋值给三个对应的浮点数或双精度的临时变量,这样可以避免编译器可能进行很多不必要的整型到浮点型的转换。这样做的副作用是,可以消除类型不明确的问题。


你还可以通过去掉那些 1.0 来简化代码:与其乘以倒数,不如直接用 h_whatever 来除这些表达式。尤其是因为每行的右半部分已经在做类似的事情了。

1

我觉得这段话是在说,h_x的类型不太明确,所以它不知道该用哪个重载的/运算符(比如double/int,double/double等等)。你可以试着把h_x转换成int或double,这样就能告诉它该用哪个版本了。

撰写回答