传递 size_t 时对重载 sqrt 函数的不明确调用

发布于 2024-11-11 17:43:08 字数 356 浏览 4 评论 0原文

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)'
string aux;
int maxy, auxx = 0;

cin >> aux;

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

Why am I getting this error:

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)'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

绝情姑娘 2024-11-18 17:43:08

string::size() 返回 size_t,而 sqrt 在其任何版本中都不接受它。所以编译器必须进行强制转换,并且不能选择什么 - 所有这些都可以。你必须显式强制转换:

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

string::size() returns size_t, and sqrt doesn't accept it in any of its versions. So the compiler has to cast, and cannot choose to what - all of them are OK. You have to put explicit cast:

maxy = (int)sqrt((double)aux.size());
感情洁癖 2024-11-18 17:43:08

问题是,在 C++ 中,存在三个名为 sqrt 的函数 - 一个接受 float,一个接受 double,一个接受 double 长双精度。当您尝试调用时,

sqrt(aux.size());

编译器会尝试确定您要调用这些函数中的哪一个。由于 aux.size() 返回一个 string::size_type,它既不是 floatdouble,也不是long double,它尝试查看string::size_type是否可以隐式转换为这三个中的任何一个。但由于 string::size_type 可以转换为所有这三种类型,因此编译器将调用标记为不明确,因为不清楚您想要执行哪种转换。

要解决此问题,您可以将 aux.size() 显式转换为您想要的类型。例如:

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

or

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

这使得调用明确匹配两个函数之一。根据您想要的精度,您可以选择三种重载中的任何一种。由于您只是转换回 int,因此在这里转换为 float 可能没问题。

The problem is that in C++, there are three functions named sqrt - one taking in a float, one taking a double, and one taking a long double. When you try calling

sqrt(aux.size());

The compiler tries to determine which of these functions you want to call. Since aux.size() returns a string::size_type, which is neither a float, double, nor long double, it tries to see if string::size_type is implicitly convertible to any of these three. But since string::size_type is convertible to all three of these types, the compiler marks the call as ambiguous, since it's unclear which of the conversions you want to do.

To fix this, you can explicitly cast aux.size() to the type that you want. For example:

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

or

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

This makes the call unambiguously match one of the two functions. Depending on the precision you want, you can choose any of the three overloads. Since you're just casting back to an int, it's probably fine to cast to a float here.

暖伴 2024-11-18 17:43:08

aux.size() 返回 std::size_t,但 sqrt() 没有采用 std 的重载版本::size_t 参数。

编译器报告 sqrt 有 3 个重载:采用 floatdoublelong double 参数。 std::size_t 可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否将 std::size_t 转换为 float< /code> 或 doublelong double

aux.size() returns an std::size_t, but sqrt() does not have an overloaded version that takes a std::size_t argument.

The compiler reports that sqrt has 3 overloads: which take float, double and long double arguments. std::size_t could be converted to any of those, so there's an ambiguity since the compiler doesn't know whether to convert std::size_t to float or double or long double.

痕至 2024-11-18 17:43:08

尝试将 aux.size() 转换为其中一种类型,这样它就不会含糊不清......

Try casting your aux.size() to one of those types, so it won't be ambiguous...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文