2013-05-13 28 views
7

tôi biên dịch chương trình của tôi trong linux - nó có dòng sau:'sqrt' không phải là một thành viên của 'std'

std::sqrt((double)num); 

Trên cửa sổ nó là ok, nhưng trên linux tôi nhận được 'sqrt' không phải là một thành viên của 'std' Tôi có một đề xuất cho math.h

vấn đề với nó là gì?

+3

Bạn có bao gồm ''? – juanchopanza

+1

'#include ', theo http://en.cppreference.com/w/cpp/numeric/math/sqrt – hmjd

Trả lời

14

Thay đổi chỉ thị thành #include <cmath>. Tiêu đề C++ của biểu mẫu <cxxxxxxx> được đảm bảo có tên chuẩn trong không gian tên std (và có thể tùy ý cung cấp chúng trong không gian tên chung). <xxxxxx.h> thì không.

+0

'đảm bảo có tên chuẩn trong không gian tên std' trước' C++ 11'. Tất nhiên lý do đã được thoải mái cho 11 là một số triển khai không bao giờ làm phiền. – BoBTFish

+4

@BoBTFish Nó vẫn đảm bảo có các tên chuẩn trong không gian tên 'std'. Pre C++ 11, nó cũng được đảm bảo _not_ để có chúng trong không gian tên chung. C++ 11 cho phép chúng cũng nằm trong không gian tên chung, vì đây là thực tế phổ biến nhất hiện nay. –

+1

@BoBTFish Những gì JamesKanze đã nói, xem 17.6.1.2/4. – jrok

2

đơn giản là vì <math.h> không khai báo các chức năng trong namespace std. Nó đã được đưa vào tiêu chuẩn C++ chỉ vì lý do tương thích. C++ chính xác bao gồm sẽ là <cmath>.

§D.5,2

Mỗi tiêu đề C, mỗi trong số đó có một cái tên có dạng name.h, cư xử như thể mỗi tên được đặt trong không gian tên thư viện chuẩn của cname tiêu đề tương ứng là được đặt trong phạm vi không gian tên chung. Nó không được chỉ định cho dù những tên này lần đầu tiên được khai báo hoặc xác định trong phạm vi không gian tên của không gian tên std và sau đó được tiêm vào phạm vi không gian tên chung bằng cách sử dụng khai báo rõ ràng.

Mã của bạn hoạt động dưới cửa sổ là may mắn - nếu bạn muốn gọi nó như vậy. Câu cuối cùng đưa ra một gợi ý những gì có thể xảy ra dưới cửa sổ, nhưng không phải dưới linux: dưới cửa sổ, rõ ràng là các tên hợp lệ trong cả không gian tên chung và không gian tên std.

+0

'' là một phần của tiêu chuẩn C, là "tính năng tương thích". Có, trên thực tế, lý do tốt để thích nó, ít nhất là trong một số trường hợp. Tất nhiên, nó khai báo ':: sqrt', và không phải' std :: sqrt'. –

+0

@JamesKanze cảm ơn sự điều chỉnh, tôi không biết điều đó. Tôi đã thay đổi câu trả lời của mình. –