'sqrt'不是'std'的成员

时间:2013-05-13 08:58:40

标签: c++ math std sqrt

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

std::sqrt((double)num);

在Windows上可以,但在linux上我得到'sqrt'不是'std'的成员 我有一个math.h的包含

它有什么问题?

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:4)

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

<强>§D.5,2

  

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

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