2011-07-04 52 views
7

Tôi có một mã C++ sử dụng rất nhiều shared_ptr và STL. Một tiêu đề phổ biến nóiC++ 0x std :: shared_ptr vs. boost :: shared_ptr

#include<boost/shared_ptr.hpp> 
using boost::shared_ptr; // for shared_ptr 
using namespace std;  // for STL 

tôi muốn chuyển sang C++ 0x tại để tận dụng các tính năng ngôn ngữ, sử dụng gcc 4.6 với -std=c++0x. Tuy nhiên, hiện tại có std::shared_ptr, dẫn đến sự mơ hồ đối với không xác định shared_ptr (boost::shared_ptr so với std::shared_ptr).

Khi chuyển sang std::shared_ptr thay vào đó, như thế này:

#include<memory> 
using namespace std;  // for STL; also imports std::shared_ptr 

sau đó tôi nhận được vấn đề với boost::python, mà làm việc apprently với boost::shared_ptr chỉ (ít nhất mà không có thêm không quan trọng):

/usr/include/boost/python/object/make_ptr_instance.hpp:30:52: error: no matching function for call to 'get_pointer(const std::shared_ptr<Cell>&)' 

My do đó, câu hỏi là

  • nếu có e là một giải pháp đơn giản để giải quyết sự mơ hồ giữa boost::shared_ptrstd::shared_ptr (ngoài hiện không sử dụng C++ 0x) và cũng có thể
  • nếu boost::shared_ptr cuối cùng sẽ là bí danh cho std::shared_ptr; điều đó sẽ giải quyết vấn đề của tôi một cách tự động.

Cảm ơn!

+0

PS. sử dụng tăng 1.42. – eudoxos

+7

GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP GIẢI PHÁP Giải pháp Và nó có thể đơn giản như việc tìm kiếm và thay thế toàn cầu cho mọi phần tử stl. – stijn

+0

Phải, đó sẽ là giải pháp, nhưng STL được sử dụng thường xuyên đến nỗi nó sẽ làm cho mã ít dễ đọc hơn; có lẽ tôi có thể xem xét việc viết bó của 'sử dụng std :: string; sử dụng std :: vector; 'etc khai báo trong tiêu đề chung. Nó thực sự không có nhiều phần 'std ::' được sử dụng, nhưng chúng được sử dụng rất thường xuyên. – eudoxos

Trả lời

2

Bạn cần định nghĩa hàm freestanding 'get_pointer' cho lớp con trỏ được chia sẻ của bạn để nó hoạt động với Boost Python. (Lưu ý rằng điều này cho phép bạn viết con trỏ chia sẻ của riêng bạn, và vẫn làm việc với Boost Python: đây là một nỗ lực thiết kế có ý thức để ngăn chặn sự ghép nối chặt chẽ của các thư viện Boost riêng biệt).

Bạn có thể nhận được điều đó bằng cách sử dụng tiêu đề tương thích tăng tr1, nhưng tôi chưa thử.

http://boost.cowic.de/rc/pdf/tr1.pdf

Khi Boost.TR1 được cấu hình để sử dụng thực hiện TR1 bản tiêu chuẩn thư viện của bạn, sau đó nó không làm rất nhiều: nó chỉ bao gồm các tiêu đề thích hợp.

Khi tăng.TR1 đang sử dụng triển khai Boost của một thành phần cụ thể, sau đó bao gồm tiêu đề Boost thích hợp và nhập các khai báo cần thiết trong không gian tên std :: tr1 bằng cách sử dụng khai báo. Lưu ý rằng chỉ những khai báo là phần của tiêu chuẩn mới được nhập: việc triển khai cố tình khá nghiêm ngặt về việc không bao gồm bất kỳ tiện ích mở rộng cụ thể nào trong std không gian tên :: tr1, để nắm bắt bất kỳ lỗi nào trong mã người dùng. Nếu bạn thực sự cần sử dụng các tiện ích mở rộng Tăng cường cụ thể thì bạn nên bao gồm tiêu đề Tăng trực tiếp và sử dụng các khai báo trong tăng cường không gian tên :: thay vào đó. Lưu ý rằng kiểu triển khai này không hoàn toàn phù hợp với tiêu chuẩn, đặc biệt không thể thêm chuyên môn mẫu do người dùng xác định là thành phần TR1 vào không gian tên std :: tr1. Ngoài ra còn có một hoặc hai thư viện Boost chưa hoàn toàn phù hợp với tiêu chuẩn, bất kỳ sự không phù hợp nào như vậy được ghi lại trong phần TR1 theo chủ đề.Hy vọng rằng, sự xuất hiện của hành vi không chuẩn nên là cực kỳ hiếm trong thực tế tuy nhiên.

Nếu bạn sử dụng tiêu đề tuân thủ chuẩn bao gồm (tăng/tr1/tr1) thì đôi khi các tên tiêu đề này có thể xung đột với các tiêu đề thư viện tiêu chuẩn hiện tại tiêu chuẩn (ví dụ: shared_ptr được thêm vào tiêu đề thư viện chuẩn hiện tại thay vì nó là tiêu đề). Các tiêu đề này chuyển tiếp tới tiêu đề thư viện chuẩn hiện tại của bạn theo một trong hai cách: cho gcc nó sử dụng #include_next, và đối với các trình biên dịch khác, nó sử dụng macro BOOST_TR1_STD_HEADER (tiêu đề) (được định nghĩa trong boost/tr1/detail/config.hpp) đánh giá để #include < ../ include/header>. Điều này sẽ làm việc "thẳng ra khỏi hộp" cho hầu hết các trình biên dịch, nhưng có nghĩa là các tiêu đề không bao giờ được đặt bên trong một thư mục có tên "include" đã có trong đường dẫn tìm kiếm của trình biên dịch của bạn.

+0

Cảm ơn! Tôi nghĩ rằng nó sẽ phức tạp hơn với boost :: python. Vâng, bây giờ tôi sử dụng tăng :: serialization là tốt, và nó không có vẻ là linh hoạt (ví dụ như [thread này] (http://stackoverflow.com/questions/4094604/boost-serialization-serialize-stdtr1shared-ptr) đề xuất để sao chép và tùy chỉnh những gì tăng :: serialization không cho tăng :: shared_ptr. – eudoxos

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