【发布时间】:2015-05-04 17:26:18
【问题描述】:
我正在尝试将工具从 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++,编写此代码的正确方法是什么?
【问题讨论】:
-
次要注意,
get_scale不是函数,而是宏。 -
重载集也可能有所不同,具体取决于您是
#include <math.h>还是#include <cmath>或两者,您是否using namespace std;(不推荐)并且还取决于工具链。它真的很丑陋。最简单的做法是使类型与 Cpow()函数匹配,因此始终选择 C 函数。 -
如果你需要计算的 10 的幂适合一个整数(看起来你正在这样做),使用静态查找表而不是调用 @ 可能会更快987654332@。无论如何我都会这样做,因为
pow的一些实现会存在轻微的舍入误差,即使您使用的是整数。 -
仅推荐电影参考。
-
人们很想用一个简单的
long数组替换缩放数组cat_names,其中包含正确的 10 次方值,只是为了移除整个可怕的结构。