2013-05-13 53 views
7

的成员,我在linux编译我的程序 - 它具有以下行:“开方”不是“性病”

std::sqrt((double)num); 

在Windows上是好的,但在linux上我得到“开方”不是'std'的成员 我有一个包含数学题.h

它有什么问题?

+3

您是否包含''? – juanchopanza 2013-05-13 09:00:30

+1

'#include ',根据http://en.cppreference.com/w/cpp/numeric/math/sqrt – hmjd 2013-05-13 09:00:32

回答

14

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

+0

'保证在'C++ 11'之前的标准名称空间中有标准名称。当然,放宽11的原因是有些实现从未打扰过。 – BoBTFish 2013-05-13 09:04:14

+4

@BoBTFish它仍然保证在'std'命名空间中有标准名称。在Pre C++ 11中,它也保证不让它们在全局命名空间中。 C++ 11允许它们也处于全局名称空间中,因为这是现有最普遍的做法。 – 2013-05-13 09:06:47

+1

@BoBTFish JamesKanze说的,见17.6.1.2/4。 – jrok 2013-05-13 09:10:54

2

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

§D.5,2

每个C头,其每一个具有形式name.h的名称,行为如同由相应的cname头放置在标准库名称空间的每个名称是放置在全局命名空间范围内。未指定这些名称是首先在名称空间std的名称空间范围内声明或定义的,然后通过使用声明以显式注入全局名称空间范围。

你的代码在windows下工作是纯粹的运气 - 如果你想这样调用它的话。最后一句提示了在windows下可能会发生什么,但不是在linux下:在windows下,显然这些名字在全局命名空间和命名空间std中都是有效的。

+0

''是标准C的一部分,作为“兼容特性”。事实上,至少在某些情况下,有更好的理由选择它。当然,它声明':: sqrt',而不是'std :: sqrt'。 – 2013-05-13 09:04:45

+0

@JamesKanze感谢您的纠正,我不知道这一点。我改变了我的答案。 – 2013-05-13 09:20:14