A vector
thường cần di chuyển các phần tử xung quanh.Mỗi khi một vector cần phát triển khi bạn gọi push_back()
, nó sẽ phân bổ lại bộ nhớ để giữ cho chính nó tiếp giáp và sao chép tất cả các phần tử hiện có vào không gian mới. Ngoài ra, nếu bạn gọi tới số insert()
hoặc remove()
thì phải chuyển đổi . Đối với vector
để có thể thực hiện tất cả các yếu tố phải có khả năng sao chép, có nghĩa là loại bạn lưu trữ trong vectơ phải có toán tử gán được xác định.
Nói chung, nếu bạn định nghĩa một lớp, trình biên dịch sẽ tạo toán tử gán cho lớp đó cho bạn. Tuy nhiên, có những trường hợp khi trình biên dịch không thể làm điều đó. Một trong những trường hợp này là khi lớp có các thành viên liên tục (lưu ý rằng con trỏ-đến-const là ok).
Vì vậy, trong trường hợp của bạn, sự cố là const string name
. Nó ngăn cản trình biên dịch tạo ra operator=()
, do đó ngăn chặn vector
từ biên dịch, mặc dù bạn không thực sự sử dụng phân công trên các phần tử của chính nó.
Một giải pháp là tạo name
không const. Cách khác là viết Student::operator=()
của riêng bạn, theo một cách nào đó có ý nghĩa. Cách thứ ba là, như bạn đã chỉ ra, sử dụng một vectơ của con trỏ thay vì một vectơ của các đối tượng. Nhưng sau đó bạn phải xử lý phân bổ của họ và de-phân bổ.
P.S. Trường hợp khác khi trình biên dịch không thể tạo ra operator=
là khi lớp của bạn có các thành viên tham chiếu.
Điều này dường như biên dịch và liên kết với VC 2010. Bạn có thể cung cấp thêm thông tin về môi trường của mình không? Đây có phải là trường hợp thử nghiệm hoàn chỉnh để tái tạo sự thất bại biên dịch đó không? – DRH
@DRH: Tôi đang ở VC 2008, xin lỗi. Và vâng, đó là toàn bộ trường hợp thử nghiệm. – Mehrdad
Trong khi các hoạt động khác, bạn sẽ cần toán tử gán, tôi không thể nghĩ ra bất kỳ lý do nào có thể tại sao 'push_back' lại có yêu cầu đó ... thì lại có thể thực hiện kiểm tra yêu cầu' Assignable'. –