首页 文章

'sqrt'不是'std'的成员

提问于
浏览
8

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

std::sqrt((double)num);

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

有什么问题吗?

2 回答

  • 2

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

    §D.5,2

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

    您的代码在Windows下运行是纯粹的运气 - 如果您想这样称呼它 . 最后一句提示暗示在windows下会发生什么,但不在linux下:在windows下,显然这些名称在全局命名空间和命名空间_40556中都有效 .

  • 15

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

相关问题