2012-01-09 12 views
5

(Sử dụng Visual Studio 2010) Tôi đang cố gắng tạo một shared_ptr của một lớp hiện có trong dự án của tôi (lớp đã được viết một thập kỷ trước khi std :: shared_ptr tồn tại). Lớp này lấy một con trỏ không const đến một đối tượng khác, đó là hàm tạo tham số rỗng là riêng tư.Lỗi trong tiêu chuẩn :: make_shared() khi cố gắng tạo shared_ptr?

class Foobar { 
public: 
    Foobar(Baz* rBaz); 

private: 
    Foobar(); 
} 

Khi tôi cố gắng tạo ra một shared_ptr với nó, mọi thứ không suôn sẻ:

Baz* myBaz = new Baz(); 
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz)); 

Mở VS2010, điều này mang lại cho tôi

error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &' 
3>   Reason: cannot convert from 'Foobar *' to 'const Foobar' 

Đối với một số lý do nó dường như đang gọi hàm tạo bản sao của Foobar thay vì hàm tạo có số Baz*.

Tôi cũng không chắc chắn về phần cannot convert from 'Foobar *' to 'const Foobar'. Giải thích tốt nhất của tôi là loại templated của tôi là shared_ptr<Foobar> là sai. Tôi đã làm cho nó shared_ptr<Foobar*> nhưng điều này có vẻ sai, tất cả các ví dụ tôi đã nhìn thấy không làm cho các loại một con trỏ nguyên.

Dường như làm cho mọi thứ shared_ptr<Foobar*> biên dịch đúng cách, nhưng điều đó có ngăn không cho đối tượng Foobar bị xóa đúng cách khi tất cả các phạm vi của shared_ptr không nằm ngoài phạm vi không?

Edit: này dường như liên quan, nhưng tôi không sử dụng Boost: boost make_shared takes in a const reference. Any way to get around this?

Edit2: Để rõ ràng, nếu bạn đang tự hỏi tại sao tôi đang sử dụng make_shared(), trong mã thực tế của tôi sharedFoo biến là thành viên của lớp thứ ba (độc lập với FoobarBaz).

+1

Tôi không thể thử nghiệm, nhưng không nên như vậy; std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –

+0

Ah! Điều đó đã thực hiện thủ thuật ... rõ ràng 'make_shared()' gọi hàm tạo của kiểu templated cho bạn, vì vậy tôi không nên đi qua một đối tượng 'mới'. Cảm ơn! Nói rằng một lần nữa như một câu trả lời và tôi sẽ đánh dấu nó là chính xác. –

+0

Xong, sau khi có thể tự mình kiểm tra :) –

Trả lời

8

Điều đó nên là;

std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz); 

... vì make_shared xây dựng đối tượng thực tế cho bạn bằng cách chạy hàm tạo.