Ошибка компилятора C++: неоднозначный вызов перегруженной функции
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)'
Зачем?
4 ответа
string::size()
возвращается size_t
, а также sqrt
не принимает его ни в одной из версий. Таким образом, компилятор должен привести, и не может выбрать, к чему - все они в порядке. Вы должны поставить явное приведение:
maxy = (int)sqrt((double)aux.size());
Проблема в том, что в C++ есть три функции с именем sqrt
- один в float
, один брал double
и один принимая long double
, Когда вы пытаетесь позвонить
sqrt(aux.size());
Компилятор пытается определить, какую из этих функций вы хотите вызвать. поскольку aux.size()
возвращает 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
Вот.
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
,
Попробуйте привести ваш aux.size() к одному из этих типов, чтобы он не был двусмысленным...