'sqrt' 不是 'std' 的成员

'sqrt' is not a member of 'std'

提问人:YAKOVM 提问时间:5/13/2013 最后编辑:MilanYAKOVM 更新时间:7/9/2022 访问量:49634

问:

我在 Linux 中编译我的程序 - 它有以下行:

std::sqrt((double)num);

在 Windows 上,没关系。但是,在 Linux 上,我收到一个错误:

sqrt不是std

我已经包括了.math.h

这有什么问题?

C++ 数学 标准 sqrt

评论

5赞 juanchopanza 5/13/2013
你包括了吗?<cmath>
2赞 hmjd 5/13/2013
#include <cmath>,根据 en.cppreference.com/w/cpp/numeric/math/sqrt
0赞 Megidd 5/14/2019
我在 Windows 和 Linux 上观察到了相同的差异

答:

36赞 jrok 5/13/2013 #1

将指令更改为 。表单的 C++ 标头保证在命名空间中具有标准名称(并且可以选择在全局命名空间中提供它们)。 不是。#include <cmath><cxxxxxxx>std<xxxxxx.h>

评论

1赞 BoBTFish 5/13/2013
guaranteed to have the standard names in std namespace以前。当然,11 放宽的原因是一些实现从未打扰过。c++11
5赞 James Kanze 5/13/2013
@BoBTFish 它仍然保证在命名空间中具有标准名称。在 C++ 11 之前,还保证它们不会在全局命名空间中出现。C++11 允许它们也位于全局命名空间中,因为这是最普遍的现有做法。std
1赞 jrok 5/13/2013
@BoBTFish JamesKanze所说的话,见17.6.1.2/4。
1赞 BoBTFish 5/13/2013
是的,对不起,我在去寻找确认之前发帖了。我不会删除它,这只会让后续评论变得混乱。
6赞 Arne Mertz 5/13/2013 #2

这仅仅是因为没有声明 中的函数。出于兼容性原因,它已包含在 C++ 标准中。正确的 C++ 包含是 。<math.h>namespace std<cmath>

第5.2节

每个 C 标头(每个标头都有一个 形式名称)的行为就好像由相应标头放置在标准库命名空间中的每个名称都放置在全局命名空间范围内一样。未指定这些名称是首先在命名空间的命名空间范围内声明或定义,然后通过显式 using declarations 注入到全局命名空间作用域中。name.hcnamestd

你的代码在Windows下工作纯粹是运气 - 如果你想这样称呼它的话。最后一句话给出了一个提示,提示在 Windows 下可能发生的情况,但在 linux 下则不然:在 Windows 下,显然这些名称在全局命名空间和命名空间中都有效。std

评论

0赞 James Kanze 5/13/2013
<math.h>是标准 C 的一部分,作为“兼容性功能”。事实上,至少有充分的理由更喜欢它,至少在某些情况下是这样。当然,它声明 ,而不是 .::sqrtstd::sqrt
0赞 Arne Mertz 5/13/2013
@JamesKanze感谢您的更正,我不知道这一点。我改变了我的答案。