c到c ++,在翻译中丢失了

时间:2015-03-03 21:34:12

标签: c++ c port

我正在尝试将工具从C转换为C ++,因此我可以编译为CLR。我是一个.NET家伙,所以这远远超出了我的舒适区。

我在下一行有一个编译错误(告诉我这是不是足够的信息):

if (qvartype[ currQ ] == FLOATING )
    *range *= get_scale( currQ );             /* Make range units match  */
                                              /* data units.             */

currQshort。错误在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 个答案:

答案 0 :(得分:4)

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

pow(10.0, ...)

应该足够了

答案 1 :(得分: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/

答案 2 :(得分:0)

根据

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

有许多pow()种变体。您正在使用类型转换调用pow(),但编译器几乎没有匹配的函数并且会混淆。

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