Ошибка компилятора 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() к одному из этих типов, чтобы он не был двусмысленным...

Другие вопросы по тегам