web-dev-qa-db-ja.com

「あいまいな」関数呼び出しを修正するにはどうすればよいですか?

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

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

編集:

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

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

Edit2:

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

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

using namespace std;

Edit3:

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

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

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

19
Moshe

発生したのは、_<cstdlib>_に_using namespace std;_が含まれていることです(iostreamに含まれているため、間接的に)。このヘッダーは、stdで2つの関数をabs()という名前で宣言します。 1つは_long long_を受け取って返し、もう1つはlongを返します。さらに、_<stdlib.h>_に由来するグローバルネームスペース(intを返す)にあります。

修正するには、まあ、2倍のabs()は_<cmath>_にあります。これにより、実際に必要な答えが得られます。

21
mkb

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

ただし、absを受け取ってdoubleを返すdoubleが本当に必要でしょう。このためには、<cmath>を含める必要があります。 double引数は正確に一致するので、コンパイラーは文句を言いません。

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

5
JohnPS

_<cmath>_で定義されているfabsを使用してみてください。 floatdoubleおよび_long double_を引数として使用します。 absは_<cmath>_と_<cstdlib>_の両方で定義されています。違いはabs(int)abs(long)およびabs(long long)は_<cstdlib>_で定義され、他のバージョンは_<cmath>_で定義されます。

2
fr0stw01f