从C到C++,翻译中迷失了。

5
我正在尝试将一个工具从C语言转换成C++,以便作为CLR编译。我是一名.NET开发者,所以这远超出了我的舒适区。
我在以下代码行上遇到了编译错误(如果这不足够,请告诉我):
if (qvartype[ currQ ] == FLOATING )
    *range *= get_scale( currQ );             /* Make range units match  */
                                              /* data units.             */

currQ 是一个 short 类型。错误定义在 get_scale 函数中。该函数在之前被定义为:

#define get_scale( i ) ((short)pow( 10, (int)((long)(cat_names[ i ]))))

我觉得下面的代码看起来很荒谬,在类型转换的地狱深处,但它在C中确实可以编译。然而,在C++中,我会收到以下错误消息:

Error   374 error C2668: 'pow' : ambiguous call to overloaded function

我知道C语言没有重载的概念,但是C++有,而这个混乱的变量签名使得不清楚应该调用哪个函数。
我该如何解决这个问题?为了最大程度地兼容C++,应该如何正确编写代码?

3
小细节,get_scale 不是一个函数,而是一个宏。 - Borgleader
1
重载函数的集合也可能因为你是否 #include <math.h> 或者 #include <cmath> 或者两者都包含,是否使用 using namespace std;(不推荐),以及工具链的不同而有所不同。这真的很丑陋。最简单的方法是使类型与 C 的 pow() 函数匹配,这样就总是选择 C 函数。 - Ben Voigt
1
如果你需要计算的10的幂可以放入一个整数中(看起来是这样),那么使用静态查找表可能比调用pow函数更快。即使你使用整数,我也会这样做,因为有些pow函数的实现存在轻微的舍入误差。 - PaulMcKenzie
1
仅因电影参考而点赞。 - Daniel Kamil Kozar
@PaulMcKenzie 我相信有很多事情我可以做来让这段代码更好地运行,但是我会满足于它能够构建。 - Jeremy Holovacs
2
人们很容易想要用一个包含10的幂正确值的简单的long数组来替换缩放数组cat_names,以消除整个可怕的结构。 - Jongware
3个回答

4

在C++中,没有满足你调用签名 (int, int) 的pow()函数的重载版本。支持的调用约定之一是(double, int),因此将你的调用修改为:

pow(10.0, ...)

应该足够了


“double pow(Type1 base, Type2 exponent);”不应该适用于(int,int)签名吗? - thermite
@thermite:那是 C++11 的扩展。 - emvee
1
@JeremyHolovacs 使用浮点数执行整数运算存在舍入误差的风险,因此用实际执行整数乘法的内联函数替换此宏将是一种改进。 - M.M
@MattMcNabb 谢谢,我会把它标记为“待办事项”...第一步是让这个捆绑包构建起来... - Jeremy Holovacs
可能有些取决于指向range变量的类型。 - emvee

0
在C++中,pow函数具有以下签名
double pow (double base, double exponent);

所以如果你把它命名为

#define get_scale( i ) ((short)pow( 10.0, (double)cat_names[ i ])))

但那是使用宏,我对此不太熟悉。我会创建一个函数

short get_scale(int i){return (short)pow( 10.0, (double)cat_names[ i ])};

请查看http://www.cplusplus.com/reference/cmath/pow/


1
那是其中一个签名。 - Ben Voigt
1
它有许多重载,否则 OP 就不会收到“调用重载函数模糊”的错误信息。 - Borgleader
我去cplusplus.com时犯了错误,它默认使用的是c90文档,只有一个签名,但你是正确的。不过改为仅使用doubles应该可以解决问题。 - thermite

0
根据。

https://msdn.microsoft.com/en-us/library/dt5dakze.aspx

有许多种pow()。您正在使用类型转换调用pow(),但编译器只有很少的匹配函数并且会感到困惑。

更改get_scale()的定义以更具体地指定类型,以便编译器可以明确选择合适的pow()版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接