Ошибка компилятора С++: неоднозначный вызов перегруженной функции
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)'
Почему?
Ответы
Ответ 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() к одному из этих типов, поэтому он не будет двусмысленным...