1

したがって、#includeが必要であり、x ^ yが機能するpow(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またはlongdoubleのどちらにプロモートするかを認識していないことです。

     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':VC ++ 2005でのみオーバーロードされた関数へのあいまいな呼び出し、alex.mは次のように書いています。

「pow」(任意のオーバーロード)は、整数ではなく、浮動小数点型の数値(single、double、またはlong doubleの精度)を最初の引数として取ります。コンパイラは長整数を変換する方法を推測できないため、これがエラーの原因です。

次のようなキャスト式を書いてみてください。

コードブロック

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

だから、あなたが試してみればpow((double)2,(num-1))、それはうまくいくはずです。


面白いことに、その冒頭をGoogleに入力すると、「オーバーロードされた関数へのあいまいな呼び出しを実行する」が、最も推奨される検索として表示されました。

于 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 に答える