2014-10-22 11 views
7

Tôi đã sử dụng một số mã cũ đã sử dụng con trỏ thô và thay đổi chúng thành unique_ptr s. Bây giờ, khi tôi cố gắng để biên dịch mã, tôi nhận được thông báo lỗi này:Lỗi C2280: cố gắng tham chiếu đến hàm đã xóa (unique_ptr)

Lỗi 1 lỗi C2280: 'std :: unique_ptr> :: unique_ptr (std :: const unique_ptr < _Ty, std :: default_delete < _Ty >> &): cố gắng để tham khảo một chức năng xóa d: \ visual studio 2013 \ vc \ include \ xmemory0

sản lượng biên dịch về tình hình là rất lớn - để tiết kiệm không gian trong câu hỏi này, nhìn thấy nó here .

Theo như tôi có thể nói, nó có liên quan đến cách tôi sử dụng các con trỏ độc đáo. Nó bắt đầu từ đây (level.h, dòng 65-66):

typedef std::unique_ptr<Enemy> PEnemy; 
std::list<PEnemy> m_enemies; 

Bây giờ, các đầu mối tiếp theo tôi nhận được ở đầu ra trình biên dịch là dòng 47 trong basesource.cpp:

std::list<PEnemy> enemies = Game::LEVEL->getEnemies(); 

Tại sao điều này có gây ra vấn đề không? Làm thế nào tôi có thể sửa lỗi?

+0

Lỗi này nhắc bạn rằng 'std :: unique_ptr' không thể sao chép được. – juanchopanza

Trả lời

15

unique_ptr s không thể sao chép được; chỉ di chuyển! Nhưng kể từ khi std::list sẽ có thể di chuyển chúng xung quanh nội bộ, vấn đề duy nhất của bạn nên được phân công mà bạn đang thực hiện vào danh sách chính nó.

Bạn có thể di chuyển danh sách này không?

  • std::list<PEnemy> enemies = std::move(Game::LEVEL->getEnemies());

Hoặc sử dụng một tham chiếu đến nó để thay thế?

  • const std::list<PEnemy>& enemies = Game::LEVEL->getEnemies();

Nếu không được (và nó sẽ phụ thuộc vào kiểu trả về của Game::LEVEL->getEnemies() như mà, nếu một trong hai, trong những giải pháp trên, bạn có thể sử dụng), bạn sẽ cần phải làm thay vào đó, hãy chuyển một bản sao sâu, sâu hoặc sang shared_ptr.

Tất cả điều này có vẻ là một trở ngại, nhưng nó thực sự giúp bạn bằng cách giữ các quy tắc về quyền sở hữu của người được chỉ định của bạn được thi hành nghiêm ngặt.

+0

Hmm, tôi nghĩ rằng tôi đã sử dụng một tham chiếu của std :: list - getEnemies() trả về 'const std :: list &'. Điều đó không tạo ra tham chiếu const? Hay tôi hoàn toàn bị mất ở đây? – manabreak

+0

@manabreak: 'const std :: danh sách & *' không hợp lệ! Không có con trỏ để tham khảo. Ngay cả khi bạn đã trả về 'const std :: list &', bạn vẫn đang bỏ tham chiếu và cố gắng sao chép danh sách đó bằng cách gán nó cho một cái mới (gọi là 'kẻ thù'). Có lẽ 'const std :: list & kẻ thù = Trò chơi :: LEVEL-> getEnemies()' có thể giúp bạn? –

+1

Dấu hoa thị là một lỗi đánh máy, tôi đã sửa nó, nhưng bạn đã lẻn qua nó. : p – manabreak

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