2011-12-12 51 views
6

Đoạn mã dưới đây không thể biên dịch bằng g ++ phiên bản 4.5.0 bằng cách sử dụng công tắc -std=c++0x. Tôi nhận được thông báo lỗi sau:C++ 11 bản sao gán cho std :: complex trong g ++ 4.5 - không phù hợp cho 'operator +'

error: no match for 'operator+' in 'std::pow [with _Tp = float, _Up = int, typename __gnu_cxx::__promote_2<_Tp, _Up>::__type = double](((const std::complex<float>&)((const std::complex<float>*)(& x))), ((const int&)((const int*)(&2)))) + y' 

Tôi tin rằng điều này liên quan đến việc yêu cầu gán nêu here. Tôi có nên định nghĩa toán tử gán bản sao của riêng mình cho phức tạp không? Nếu vậy, làm thế nào?

#include <complex> 
using namespace std; 

int main(int argc, char *argv[]) { 
    complex<float> x,y; 
    x = pow(x,2);  // ok 
    x = x  + y; // ok 
    x = pow(x,2) + y; // error 
    return 0; 
} 
+2

Lỗi, được đơn giản hóa, cho biết "Không có toán tử + phức tạp và phức tạp " – Cubbi

+0

@parapura rajkumar: Thật không may là không. – user2023370

+0

Điều này biên dịch trên VS2010 có lẽ cần mẫu hoặc từ khóa tên. – AJG85

Trả lời

11

[cmplx.over]/p3 quy định cụ thể quá tải bổ sung cho pow khi complex tham gia:

Chức năng mẫu pow có trách nhiệm quá tải thêm đủ để đảm bảo, cho một cuộc gọi với ít nhất một đối số kiểu complex<T>:

  1. Nếu một trong hai tham số có kiểu complex<long double> hoặc gõ long double, sau đó cả hai đối số được truyền một cách hiệu quả đến complex<long double>.

  2. Ngược lại, nếu một trong hai tham số có kiểu complex<double>, double, hoặc một loại số nguyên, sau đó cả hai lập luận được một cách hiệu quả để đúc complex<double>.

  3. Nếu không, nếu một trong hai đối số có loại complex<float> hoặc float thì cả hai đối số đều được truyền thành công complex<float>.

2 đã được đề bạt lên một đôi, và trả về một pow(complex<float>, double)complex<double>.

+0

+1. Sau khi nhìn thấy lỗi, tôi đã mong đợi điều này. – Nawaz

+3

Chi tiết bổ sung: Sự khác biệt từ C++ 03 có thể được truy ngược lại báo cáo lỗi này: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844 - chúng đã bị xóa quá tải bổ sung: mẫu phức tạp pow (const phức hợp & x, int y); – wolfgang

+1

Tôi hiểu, cảm ơn. Trong C++ 03 cùng một 'pow (x, 2)' trả về một 'phức tạp ' thay vì 'phức tạp '; và không bao giờ có một toán tử '+' giữa 'phức tạp ' và 'phức tạp '. – user2023370

Các vấn đề liên quan