我在Linux上编译我的程序 - 它有以下代码行:
std::sqrt((double)num);
在Windows上没问题,但是在Linux上出错了:
sqrt
不是std
的成员
我已经包含了 math.h
,这是什么问题呢?
将指令更改为#include <cmath>
。 C++头文件的形式为<cxxxxxxx>
,保证在std
命名空间中具有标准名称(并且可以选择在全局命名空间中提供它们)。<xxxxxx.h>
则不一定。
std
命名空间中的标准名称是有保证的。在 C++11 之前,这些名称不会在全局命名空间中出现。但是,C++11 允许它们同时存在于全局命名空间中,因为这是最普遍的现有实践。 - James Kanze<math.h>
并没有在namespace std
中声明函数。它仅被包含在C++标准中以保持兼容性。正确的C++ include应该是<cmath>
。name.h
,都会将相应cname
头文件中放置在标准库命名空间中的每个名称视为放置在全局命名空间范围内。未指定这些名称首先是否在命名空间std
的命名空间范围内声明或定义,然后通过显式using-declarations注入到全局命名空间范围内。std
中都是有效的。<math.h>
是标准C的一部分,作为“兼容性特性”。实际上,在某些情况下,有很好的理由优先选择它。当然,它声明了::sqrt
而不是std::sqrt
。 - James Kanze
<cmath>
吗? - juanchopanza#include <cmath>
, 根据 http://en.cppreference.com/w/cpp/numeric/math/sqrt - hmjd