错误:'operator/'的重载不明确
我刚接触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 个回答
我强烈建议你仔细去掉那些完全多余的括号,然后认真看看剩下的部分。
比如,这段代码:
((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
的分开写法,让人不禁想知道最开始的意图是什么。
如果 h_x
是 float
类型,那么当你用 1.0
(默认是 double
类型)去除以它时,C语言就会搞不清楚到底是用浮点数运算还是双精度运算。
如果你想用浮点数运算,就把 1.0
改成 1.0f
;如果想用双精度运算,那就把你的 h_x
声明为 double
类型,或者进行类型转换。
如果 h_x
是 int
类型(这我最担心的),你最好在循环外面把你的 h_?
变量赋值给三个对应的浮点数或双精度的临时变量,这样可以避免编译器可能进行很多不必要的整型到浮点型的转换。这样做的副作用是,可以消除类型不明确的问题。
你还可以通过去掉那些 1.0
来简化代码:与其乘以倒数,不如直接用 h_whatever
来除这些表达式。尤其是因为每行的右半部分已经在做类似的事情了。
我觉得这段话是在说,h_x的类型不太明确,所以它不知道该用哪个重载的/运算符(比如double/int,double/double等等)。你可以试着把h_x转换成int或double,这样就能告诉它该用哪个版本了。