1

所以我意识到#include 是必要的,并且有一个 pow(x,y) x^y 可以工作......但是当我尝试使用 pow(2,(num-1)) 时,它会返回一个错误...

errorC2668: 'pow' : 对重载函数的模糊调用

我的代码行如下

perfect = (pow(2,(num-1))) * (pow(2,num)-1);

有什么建议吗?

提前致谢

编辑:

num 确实被声明为 int。

num 确实有一个值,从 1 开始到 UINT_MAX

在等式中添加了一个星号

4

5 回答 5

8

编译器不知道要调用哪个 pow() 函数。此处列出的重载给出了以下列表:

      float pow (       float base,       float exponent );
     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,         int exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

编译器不会猜测使用哪一个。使用强制转换使其明确。

perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1);

那里可能有一些额外的演员表,但他们不会伤害任何东西。

于 2009-04-03T05:19:10.777 回答
2

这些是pow()C++ 中允许的函数。问题是您的代码有一个 int 作为第一个参数,而 C++ 不知道是将其提升为 double 还是 long double。

     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

尝试放入(double)2而不是仅仅2.

perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1)
于 2009-04-03T05:19:57.950 回答
1

添加缺少的乘法(或您想要的),并且在行尾应该有分号:

perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;
于 2009-04-03T05:18:17.207 回答
1

错误 C2668: 'pow' : ambiguous call to VC++ 2005 only 中的重载函数,alex.m 写道,

“pow”(任何重载)将浮点类型数(单精度、双精度或长双精度)作为第一个参数,而不是整数。这就是错误的来源,因为编译器无法猜测您希望转换长整数的方式。

只需尝试编写一个强制转换表达式,如下所示:

代码块

c = pow((double)numberOfScansCompleted, 2);

因此,如果您尝试pow((double)2,(num-1)),它应该可以工作。


有趣的旁注,当我在谷歌中输入它的开头时,“pow ambiguous call to overloaded function”出现在建议的搜索中。

于 2009-04-03T05:21:15.700 回答
0

请记住,您还可以使用移位运算符编写 2 的整数幂:

int perfect = (1<<(num-1)) * ((1<<num) - 1);

或与ldexp(也包括从<cmath>):

double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);
于 2009-04-03T08:26:18.080 回答