Двусмысленность квадратный корень
Возможный дубликат:
Ошибка компилятора C++: неоднозначный вызов перегруженной функции
просто скопировал некоторый код из pdf в C++ Builder XE2 и Visual Studio Express 2012. Оба компилятора выдают коды ошибок о неоднозначности. Я только начал, поэтому я не знаю, что делать. Может быть, мой учебник (pdf) сейчас устарел? это называется "Учиться с ++ за 14 дней". Ну в любом случае вот скопированный код.
#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++ Builder:
[Ошибка BCC32] SquareRoot.cpp(19): E2015 Неоднозначность между 'std::sqrt(float) в c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\math.h:266'и'std::sqrt(long double) в c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\math.h:302'Полный контекст синтаксического анализатора SquareRoot.cpp(18): Разбор: void getSqrRoot(char *,int)
Кроме того, кавычки в моем руководстве pdf - это символы, отличные от обычных "которые я печатаю. Они" также не совместимы с компилятором. Может быть, кто-нибудь также знает, как исправить это? Заранее спасибо.
2 ответа
Измените свой код следующим образом:
void getSqrRoot(char* buff, int x)
{
sprintf(buff, “The sqaure root is: %f”, sqrt((float)x));
}
Поскольку квадратный корень перегружен, функция-компилятор не имеет возможности неявного преобразования из значения int x в число с плавающей точкой или двойное значение, вам нужно сделать это напрямую.
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!
Измените вашу функцию getSqrRoot на следующую
void getSqrRoot(char* buff, float x)
{
И аналогично исправьте объявление в первой строке.
Это происходит потому, что std::sqrt
это функция, которую вы используете, чтобы получить квадратный корень, может взять либо float
или double
но вы дали ему int
что приводит к путанице, поскольку компилятор теперь не знает, какую функцию вызывать.