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

c to c++, lost in translation

我正在尝试将一个工具从 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++ 兼容,正确的编写方法是什么?

在 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/

根据

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

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

get_scale() 的定义更改为更具体的类型,因此编译器可以 select 明确地 pow() 版本。

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

pow(10.0, ...)

应该够了