Visual Studio не позволяет мне использовать sqrt или floor, неоднозначный вызов перегруженной функции

мне нужно позвонить

long long a = sqrt(n/2);

и a и n are long longно он не позволит мне компилировать, потому что он говорит, что я использую sqrt() неоднозначный вызов. Я не понимаю, как здесь вообще может быть двусмысленно. Как мне решить эту проблему? У меня такая же проблема с floor().

мой включает в себя

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

4 ответов


есть несколько перегрузок sqrt() и floor(), нет" лучшего соответствия " для вызова sqrt(long long) согласно правилам разрешения перегрузки. Просто приведите аргумент к соответствующему типу - т. е.

long long a = sqrt(static_cast<double>(n/2));

//use 
sqrt(static_cast<double>(n/2));
//instead of 
sqrt(n/2);

на sqrt функции ожидает float, a double или long double:

long long a = sqrt(n * 0.5);

вы можете потерять некоторые точность преобразование long long до double, но значение будет очень близко.


согласно справке

http://www.cplusplus.com/reference/clibrary/cmath/sqrt/

Я бы предложил преобразовать в двойной первый. Нет перегрузки sqrt принимает целочисленное значение

интегральный параметр всегда может привести к "реальному" значению (float, double, long double)