私はクラスのC++プログラムに取り組んでおり、コンパイラーは「あいまいな」関数呼び出しについて不平を言っています。これは、異なるパラメーターで定義された関数がいくつかあるためだと思います。
どのようにしてコンパイラーに必要なものを指示できますか?ケース固有の修正とは別に、これらの種類の問題を解決する可能性のある型キャストなどの一般的なルールはありますか?
編集:
私の場合、cout
ステートメント内でabs()
を呼び出し、2つのdouble
sを渡してみました。
cout << "Amount is:" << abs(amountOrdered-amountPaid);
Edit2:
次の3つのヘッダーを含めています。
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
Edit3:
私はこのコードなしでプログラムを終了しましたが、この質問をフォローするために、問題を再現しました。逐語的エラーは次のとおりです。
「abs」の呼び出しがあいまいです。
コンパイラーはabs
の3つのバージョンを提供し、それぞれがパラメーターとして異なるデータ型を取ります。
発生したのは、_<cstdlib>
_に_using namespace std;
_が含まれていることです(iostream
に含まれているため、間接的に)。このヘッダーは、std
で2つの関数をabs()
という名前で宣言します。 1つは_long long
_を受け取って返し、もう1つはlong
を返します。さらに、_<stdlib.h>
_に由来するグローバルネームスペース(int
を返す)にあります。
修正するには、まあ、2倍のabs()
は_<cmath>
_にあります。これにより、実際に必要な答えが得られます。
<cstdlib>
に含まれるabs
関数は、int
およびlong
およびlong long
に対してオーバーロードされます。引数としてdouble
を指定しているため、コンパイラーは正確に適合しないため、double
をabs
が受け入れる型に変換しようとしますが、 int
、long
、またはlong long
に変換する必要があるかどうかわからないため、あいまいです。
ただし、abs
を受け取ってdouble
を返すdouble
が本当に必要でしょう。このためには、<cmath>
を含める必要があります。 double
引数は正確に一致するので、コンパイラーは文句を言いません。
発生してはならない他のヘッダーをインクルードすると、<cstdlib>
が自動的にインクルードされるようです。コンパイラーはerror: ‘abs’ was not declared in this scope
または類似のものを指定する必要があります。
_<cmath>
_で定義されているfabs
を使用してみてください。 float
、double
および_long double
_を引数として使用します。 abs
は_<cmath>
_と_<cstdlib>
_の両方で定義されています。違いはabs(int)
、abs(long)
およびabs(long long)
は_<cstdlib>
_で定義され、他のバージョンは_<cmath>
_で定義されます。