2011-08-01 31 views
5

Tôi nhận được lỗi biên dịch với g ++ 4.6 và tăng 1.42 khi sử dụng boost::make_shared<T>(...), trong khi shared_ptr<T>(new T(...)) chỉ biên dịch khỏe. Tôi tiếc là không thể cô lập một ví dụ tối thiểu (bất cứ điều gì tôi đã thử biên soạn tốt cho cả hai), nhưng có lẽ ai đó có thể giải thích cho tôi sự khác biệt.boost :: make_shared <T> (...) không biên dịch, shared_ptr <T> (mới T (...)) hiện

Tôi instatiating một thể hiện của shared_ptr<ResidualsFunctor> f, nơi ResidualsFunctor có ctor sau:

ResidualsFunctor(int,int,StaticEquilibriumSolver*) 

này

f=shared_ptr<ResidualsFunctor>(new ResidualsFunctor(0,0,this)); // this is a StaticEquilibriumSolver* 

biên dịch tốt, trong khi

f=make_shared<ResidualsFunctor>(0,0,this); 

nói với tôi:

/usr/include/boost/smart_ptr/make_shared.hpp: In function 'boost::shared_ptr<T> boost::make_shared(Args&& ...) [with T = StaticEquilibriumSolver::ResidualsFunctor, Args = int, int, StaticEquilibriumSolver* const]': 
pkg/sparc/SparcField.cpp:472:49: instantiated from here 
/usr/include/boost/smart_ptr/make_shared.hpp:148:5: error: no matching function for call to 'forward(int&)' 
/usr/include/boost/smart_ptr/make_shared.hpp:148:5: note: candidate is: 
/usr/include/boost/smart_ptr/make_shared.hpp:90:40: note: template<class T> T&& boost::detail::forward(T&&) 

Đây có phải là lỗi trong việc tăng cường không? Trong gcc? Lỗi của tôi mà tôi không thấy?

+1

Điều này giống như một tương tác lẻ giữa tương đương với Boost của 'std :: forward' và trình biên dịch của bạn. Bạn đang sử dụng phiên bản trình biên dịch nào và bạn đang sử dụng phiên bản Boost nào? –

+0

Nó được xác định trong câu hỏi, g ++ 4.6 và tăng 1.42. – eudoxos

Trả lời

4

boost::make_shared phân bổ đối tượng thuộc loại đã cho, sử dụng các tham số đã cho và kết thúc nó trong một boost::shared_ptr. Do đó, nó phải chuyển tiếp các đối số mà bạn đưa nó cho một hàm tạo. Để cuộc gọi của bạn hoạt động, nó phải có khả năng tìm một hàm tạo phù hợp với danh sách đối số mà bạn đưa ra.

Vấn đề của bạn có vẻ là khó khăn khi chuyển tiếp đối số nguyên của bạn. Tôi không chắc chắn làm thế nào, như tất cả các đối số của bạn là các loại cơ bản.

Tăng 1,42 đã được phát hành cách đây 18 tháng; GCC 4.6 được phát hành khá gần đây hơn thế. Tôi đoán rằng nếu bạn cập nhật lên phiên bản Boost mới hơn, bạn sẽ không gặp phải vấn đề này.

+0

'boost :: make_shared' chỉ hoạt động tốt trong các trường hợp khác, đó là lý do tại sao tôi không hiểu điều gì đang xảy ra ở đây ... – eudoxos

+1

@euxodos - Quy tắc chuyển tiếp và tham chiếu rvalue đã thay đổi trong 18 tháng này. Có vẻ như trình biên dịch và thư viện được mã hóa dựa trên các quy tắc khác nhau. –

+0

Tôi không thể cập nhật máy ATM trên toàn hệ thống, mặc dù tôi rất vui vì nguồn gốc của vấn đề là rõ ràng. – eudoxos

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