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