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 ])};
根据
https://msdn.microsoft.com/en-us/library/dt5dakze.aspx
有很多 pow()
变体。您正在使用类型转换调用 pow()
,但编译器匹配的函数很少并且感到困惑。
将 get_scale()
的定义更改为更具体的类型,因此编译器可以 select 明确地 pow()
版本。
C++ 中没有 pow() 的重载版本可以满足您 (int, int)
的调用签名。受支持的调用约定之一是 (double, int)
因此将您的调用修改为:
pow(10.0, ...)
应该够了
我正在尝试将一个工具从 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 ])};
根据
https://msdn.microsoft.com/en-us/library/dt5dakze.aspx
有很多 pow()
变体。您正在使用类型转换调用 pow()
,但编译器匹配的函数很少并且感到困惑。
将 get_scale()
的定义更改为更具体的类型,因此编译器可以 select 明确地 pow()
版本。
C++ 中没有 pow() 的重载版本可以满足您 (int, int)
的调用签名。受支持的调用约定之一是 (double, int)
因此将您的调用修改为:
pow(10.0, ...)
应该够了