我正在尝试将工具从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 ++最大程度的兼容性,写这个的正确方法是什么?
答案 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 ])};
答案 2 :(得分:0)
根据
https://msdn.microsoft.com/en-us/library/dt5dakze.aspx
有许多pow()
种变体。您正在使用类型转换调用pow()
,但编译器几乎没有匹配的函数并且会混淆。
将get_scale()
的定义更改为更具体的类型,以便编译器可以明确地选择正确的pow()
版本。