2014-09-01 21 views
5

mã sau đây đưa ra một lỗi biên dịch (ít nhất là khi sử dụng MS VS 2008) cho dòng "e = f" trong main():lỗi C2582: 'operator =' chức năng không có sẵn trong 'B'

lỗi C2582: 'operator =' chức năng không có sẵn trong 'B'

class A { 
public: 
    A() { } 
    static const double x; 
}; 
const double A::x = 0.0; 

class B { 
public: 
    B() : x(0.0) { } 
    const double x; 
}; 

int main(int argc, char *argv[]) 
{ 
    A c,d; 
    B e,f; 

    c = d; 
    e = f; 

    return 0; 
} 

toán tử gán mặc định nên được tạo ra cho cả hai lớp, A và B?

trong 12.8.10: "Nếu định nghĩa lớp không khai báo rõ ràng nhà điều hành gán bản sao , một tuyên bố hoàn toàn".

Trả lời

14

Toán tử được tạo ngầm sẽ gán một cách đệ quy cho mỗi thành viên không tĩnh. Tuy nhiên, xconst, do đó không thể gán được. Điều này ngăn chặn các nhà điều hành ngầm được tạo ra (cụ thể, nó làm cho nó được định nghĩa là đã xóa).

này được quy định trong C++ 11 12,8/23:

Một bản sao/di chuyển toán tử gán defaulted cho lớp X được định nghĩa là xóa nếu X có:

  • ...
  • thành viên dữ liệu không tĩnh của const loại phi lớp (hoặc mảng đó), hoặc
  • ...

(Mặc dù tôi vừa nhận thấy rằng trình biên dịch của bạn có trước C++ 11; các quy tắc tương tự, nhưng được quy định bằng ngôn ngữ khác, trong các phương ngữ cũ hơn không có khái niệm về các hàm "đã xóa").

Nếu bạn muốn một toán tử gán cho một lớp có thành viên (hoặc lớp cơ sở) không thể được gán lại, bạn sẽ phải tự định nghĩa nó.

Trong class A, thành viên cố định là tĩnh, do đó, không tạo thành một phần của đối tượng. Do đó, nó không ngăn một đối tượng (trống) được gán cho.

2

Sự khác biệt rõ ràng giữa lớp A và B là thành viên const x beeing tĩnh so với không tĩnh. Chuyển nhượng cho một biến const là/nên là không thể trong mọi trường hợp.

Trình biên dịch rõ ràng là cố gắng tạo phương thức toán tử gán mặc định cho lớp B và âm thầm quyết định không tạo một lớp, vì thành viên x không cho phép gán.

Đã cho tôi một thời gian khá dài để tìm hiểu này ...

BTW: Nếu bạn bỏ qua việc khởi tạo của x trong lớp B, trình biên dịch là đủ thông minh để tìm ra sai lầm này.

+4

Có bạn đã trả lời câu hỏi của riêng bạn.Bạn nhận được một huy hiệu (nhưng không có đại diện) nếu bạn chấp nhận câu trả lời của bạn. – CashCow

4

lĩnh vực 'x' là loại const đủ của const double, toán tử gán mặc định sẽ là vô nghĩa và là ngầm xóa đây

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