2013-09-26 66 views
12

Khi tôi đang chuyển đổi phiên bản trình biên dịch từ gcc 4.6 sang gcc 4.8 Tôi nhận được lỗi sau đây lỗi: cuộc gọi quá tải 'isnan (double)' không rõ ràng.porting isnan to C++ 11

Điều này là do trong C++ 11 có tờ khai chức năng differend: C: int isNaN (double) C++ 11: bool isNaN (double)

từ cpluplus:

  • Trong C, điều này được thực hiện như một macro trả về giá trị int. Loại x phải là phao, gấp đôi hoặc dài gấp đôi.
  • Trong C++, nó được thực hiện với quá tải hàm cho mỗi loại dấu phẩy động, mỗi trả về một giá trị bool.

Làm cách nào để khắc phục sự cố này?

+1

How are you gọi đó? Cho chúng tôi thấy bối cảnh. –

+0

đề xuất juanchoupanza đã hoạt động. Tôi đã tuyên bố bằng cách sử dụng không gian tên trước đây, nhưng tôi đã phải thêm nó vào cuộc gọi isnan vì đó là nguồn gốc của sự mơ hồ. –

+16

Đó là chính xác những gì sai với 'sử dụng không gian tên std' ở khắp mọi nơi. –

Trả lời

13

Mặc dù bạn có thể giảm thiểu vấn đề này bằng cách không nói using namespace std; ở khắp mọi nơi, bạn có thể tránh nó bằng cách rõ ràng về việc sử dụng std::isnan:

#include <cmath> 
#include <iostream> 

int main() 
{ 
    double x = ....; 
    std::cout << std::boolalpha; 
    std::cout << std::isnan(x) << std::endl; 
} 
+0

Cách tiếp cận này chắc chắn sẽ hoạt động nhưng nó sẽ không thích hợp để loại bỏ "sử dụng không gian tên std" trong một codebase lớn vì nó có thể cần quá nhiều thay đổi. – wazza

+0

@wazza Nó sẽ thích hợp hơn là để lại mã bị hỏng. 'using namespace std;' là một công thức gây rắc rối. Tôi nghĩ rằng chi tiêu thời gian tẩy nó từ mã là thời gian cũng chi tiêu. – juanchopanza