Подтвердить что ты не робот

Ошибка компилятора С++: неоднозначный вызов перегруженной функции

string aux;
int maxy,auxx=0;

cin>>aux;

maxy= (int)sqrt(aux.size());

Я получаю:

1> error C2668: 'sqrt' : ambiguous call to overloaded function
1>        could be 'long double sqrt(long double)'
1>        or       'float sqrt(float)'
1>        or       'double sqrt(double)'

Почему?

4b9b3361

Ответ 1

string::size() возвращает size_t, а sqrt не принимает его ни в одной из своих версий. Поэтому компилятор должен отдать, и не может выбрать, что - все они в порядке. Вы должны указать явное приведение:

maxy = (int)sqrt((double)aux.size());

Ответ 2

Проблема заключается в том, что в С++ существуют три функции с именем sqrt - один из них в float, один принимает double, а один принимает long double. Когда вы пытаетесь позвонить

sqrt(aux.size());

Компилятор пытается определить, какую из этих функций вы хотите вызвать. Поскольку aux.size() возвращает a string::size_type, который не является ни float, double, ни long double, он пытается увидеть, что string::size_type неявно конвертируется в любой из этих трех. Но так как string::size_type можно конвертировать во все три из этих типов, компилятор отмечает этот вызов как неоднозначный, так как неясно, какие из преобразований вы хотите сделать.

Чтобы исправить это, вы можете явно применить aux.size() к типу, который вы хотите. Например:

sqrt(double(aux.size()));

или

sqrt(float(aux.size()));

Это делает вызов однозначно совпадающим с одной из двух функций. В зависимости от требуемой точности вы можете выбрать любую из трех перегрузок. Так как вы просто возвращаетесь к int, то, возможно, это отличное отключение к float здесь.

Ответ 3

aux.size() возвращает std::size_t, но sqrt() не имеет перегруженной версии, которая принимает аргумент std::size_t.

Компилятор сообщает, что sqrt имеет 3 перегрузки: которые принимают аргументы float, double и long double. std::size_t может быть преобразован в любой из них, поэтому существует неоднозначность, поскольку компилятор не знает, следует ли преобразовывать std::size_t в float или double или long double.

Ответ 4

Попробуйте применить ваш aux.size() к одному из этих типов, поэтому он не будет двусмысленным...