25

クラス用の C++ プログラムに取り組んでいますが、コンパイラが「あいまいな」関数呼び出しについて不平を言っています。これは、異なるパラメーターで定義された関数がいくつかあるためだと思われます。

どちらが必要かをコンパイラに伝えるにはどうすればよいですか? ケース固有の修正とは別に、この種の問題を解決する可能性のある型キャストなどの一般的なルールはありますか?

編集:

私の場合、2 つの s を渡して、ステートメントabs()内で呼び出しを試みました。coutdouble

cout << "Amount is:" << abs(amountOrdered-amountPaid);

編集2:

次の 3 つのヘッダーを含めます。

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

編集3:

このコードなしでプログラムを終了しましたが、この質問を最後までやり遂げるために、問題を再現しました。逐語的なエラーは次のとおりです。

'abs' の呼び出しがあいまいです。

コンパイラは の 3 つのバージョンを提供しabs、それぞれが異なるデータ型をパラメータとして受け取ります。

4

4 に答える 4

23

何が起こったのかというと<cstdlib>、( によって含まれているため、間接的にiostream) と一緒に含まれているということですusing namespace std;。このヘッダーstdは、 という名前で 2 つの関数を宣言しabs()ます。1 つは取得して返さlong longれ、もう 1 つは返されますlong。さらに、グローバル名前空間 ( を返すint) には、 から来るものがあり<stdlib.h>ます。

修正するには: まあ、abs()double を取る は に<cmath>あり、実際に必要な答えが得られます!

于 2011-09-26T02:08:13.510 に答える
5

によって含まれるabs関数は、 andおよび<cstdlib>に対してオーバーロードされます。引数としてaを指定すると、コンパイラは正確に適合しないため、を受け入れる型に変換しようとしますが、 、、またはに変換しようとするかどうかがわからないため、あいまいです。intlonglong longdoubledoubleabsintlonglong long

absしかし、おそらく、 a を取り、 adoubleを返すが本当に必要ですdouble。このためには、 を含める必要があります<cmath>。引数が正確に一致するためdouble、コンパイラは文句を言いません。

<cstdlib>発生しないはずの他のヘッダーを含めると、自動的に含まれるようです。コンパイラは、error: ‘abs’ was not declared in this scopeまたは同様のものを指定する必要があります。

于 2011-09-26T03:49:26.060 に答える
2

fabsdefined inを使用してみてください<cmath>floatdoubleおよびlong doubleを引数として取ります。absは と の両方で定義され<cmath>てい<cstdlib>ます。違いはabs(int)abs(long)abs(long long)が で定義されて<cstdlib>いるのに対し、他のバージョンは で定義されてい<cmath>ます。

于 2013-12-05T13:23:16.593 に答える
-2

これが abs の int バージョンを呼び出していない理由はわかりませんが、式 (amountOrdered - amountPaid) を int として型キャストしてみることができます。

cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );
于 2011-09-26T01:52:15.903 に答える