'sqrt'不是'std'的成员

Yak*_*kov 15 c++ math std sqrt

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

std::sqrt((double)num);
Run Code Online (Sandbox Code Playgroud)

在Windows上没关系,但是在linux上我得到'sqrt'不是'std'的成员我有一个包括math.h

有什么问题吗?

jro*_*rok 21

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

  • @BoBTFish仍然保证在`std`命名空间中有标准名称.在C++ 11之前,它还保证_not_将它们放在全局命名空间中.C++ 11允许它们也在全局命名空间中,因为这是最广泛的现有实践. (5认同)

Arn*_*rtz 5

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

§D.5,2

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

您的代码在 Windows 下运行纯属运气 - 如果您想这样称呼它。最后一句暗示了在 windows 下可能会发生什么,但在 linux 下不会发生:在 windows 下,显然这些名称在 global namespace 和 namespace 中都是有效的std