提问人:YAKOVM 提问时间:5/13/2013 最后编辑:MilanYAKOVM 更新时间:7/9/2022 访问量:49634
'sqrt' 不是 'std' 的成员
'sqrt' is not a member of 'std'
问:
我在 Linux 中编译我的程序 - 它有以下行:
std::sqrt((double)num);
在 Windows 上,没关系。但是,在 Linux 上,我收到一个错误:
sqrt
不是std
我已经包括了.math.h
这有什么问题?
答:
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.h
cname
std
你的代码在Windows下工作纯粹是运气 - 如果你想这样称呼它的话。最后一句话给出了一个提示,提示在 Windows 下可能发生的情况,但在 linux 下则不然:在 Windows 下,显然这些名称在全局命名空间和命名空间中都有效。std
评论
0赞
James Kanze
5/13/2013
<math.h>
是标准 C 的一部分,作为“兼容性功能”。事实上,至少有充分的理由更喜欢它,至少在某些情况下是这样。当然,它声明 ,而不是 .::sqrt
std::sqrt
0赞
Arne Mertz
5/13/2013
@JamesKanze感谢您的更正,我不知道这一点。我改变了我的答案。
评论
<cmath>
#include <cmath>
,根据 en.cppreference.com/w/cpp/numeric/math/sqrt