1

重複の可能性:
C++ コンパイラ エラー: オーバーロードされた関数のあいまいな呼び出し

pdf から C++builder XE2 と Visual Studio Express 2012 の両方にいくつかのコードをコピーしただけです。どちらのコンパイラもあいまいさに関するエラー コードを返します。まだ始めたばかりなので、どうしたらいいのかわかりません。私の教科書(pdf)は古くて時代遅れでしょうか?それは「14日間でC ++を学ぶ」と呼ばれています。とにかく、ここにコピーされたコードがあります。

#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#pragma hdrstop
void getSqrRoot(char* buff, int x);
int main(int argc, char** argv)
{
int x;
char buff[30];
cout << “Enter a number: “;
cin >> x;
getSqrRoot(buff, x);
cout << buff;
getch();
}
void getSqrRoot(char* buff, int x)
{
sprintf(buff, “The sqaure root is: %f”, sqrt(x));
}

私がc ++ビルダーで得たエラーコードは次のとおりです。

[BCC32 エラー] SquareRoot.cpp(19): E2015 c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\math.h:266 の 'std::sqrt(float) 間のあいまいさ' and 'std::sqrt(long double) at c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\math.h:302' 完全なパーサー コンテキスト SquareRoot.cpp(18):解析中: void getSqrRoot(char *,int)

余談ですが、私の PDF マニュアルの引用符は、私が入力した通常の " とは異なる文字です。これらの " もコンパイラと互換性がありません。誰かがこれに対する修正も知っているのではないでしょうか? 事前に感謝します。

4

2 に答える 2

3

次のようにコードを変更します。

void getSqrRoot(char* buff, int x)
{
 sprintf(buff, “The sqaure root is: %f”, sqrt((float)x));
}

平方根はオーバーロードされた関数であるため、コンパイラは int x 値から float または double 値への暗黙的な変換を行う機会がないため、直接行う必要があります。

Compiler: see sqrt(int) -> what to choose? sqrt(float)/sqrt(double) ?
Compiler: see sqrt((float)int) -> sqrt(float), ok!
Compeler: see sqrt((double)int) -> sqrt(double), ok!
于 2012-12-14T07:50:30.820 に答える
1

getSqrRoot 関数を以下に変更します

void getSqrRoot(char* buff, float x)
{

同様に、最初の行の宣言を修正します。

これはstd::sqrt、平方根を取得するために使用している関数が afloatまたは a のいずれかを取ることができるが、コンパイラが呼び出す関数がわからないため、混乱につながるadoubleを指定したために発生します。int

于 2012-12-14T07:02:25.220 に答える