Shared_ptr '?


103

Tôi rất thất vọng ngay bây giờ sau nhiều giờ cố gắng tìm kiếm shared_ptr ''. Không có ví dụ nào tôi thấy hiển thị mã hoàn chỉnh để bao gồm các tiêu đề shared_ptr(và đang hoạt động). Nói đơn giản std, tr1<memory>không giúp ích gì cả! Tôi đã tải về các phần mềm tăng cường và tất cả nhưng nó vẫn không hiển thị! Ai đó có thể giúp tôi bằng cách cho biết chính xác nơi để tìm nó?

Cảm ơn vì đã cho tôi trút bỏ những bực bội!

CHỈNH SỬA: Tôi thấy tiêu đề của tôi đã được thay đổi. Xin lỗi vì điều đó. Vì vậy ... cũng là do tôi không hiểu rõ shared_ptr là "phụ thuộc vào phiên bản C ++" -> đó là lý do tại sao tôi không nêu môi trường của mình -> do đó có lẽ tại sao tôi rất khó tìm thấy nó.

Tôi đang làm việc trên MSVS2008.

CHỈNH SỬA 2: Tôi không biết tại sao, nhưng tôi đã bao gồm [memory] và [boost / tr1 / memory.hpp] và [boost / tr1 / tr1 / memory] trong khi tìm kiếm shared_ptr .. tất nhiên, tôi không thể 't.

Cảm ơn vì tất cả những phản hồi.


3
có lẽ sẽ hữu ích nếu bạn có thể nêu thiết lập của mình một cách chính xác, như trình biên dịch và phiên bản tăng cường / đường dẫn cài đặt
YeenFei

7
Trừ khi bạn đang sử dụng C ++ 0x, shared_ptrkhông phải là một phần của tiêu chuẩn. Nó rất phổ biến mặc dù một số sẽ coi nó là tiêu chuẩn mặc dù nó chưa có trong tay.
Billy ONeal

4
Bạn nghĩ chúng ta nên trả lời câu hỏi này như thế nào khi không biết liệu môi trường của bạn là GCC cho chip máy rửa bát 7,5bit, trình biên dịch độc quyền của máy tính lớn 128bit hay phiên bản GCC của XCode?
sbi

Chỉ để thêm một số thông tin về vấn đề tôi gặp phải .. Nếu bạn muốn biên dịch với tiêu chuẩn c ++ 0x, bạn cần thêm "-std = c ++ 0x" làm đối số của g ++.
Mital Vora

1
Nếu bạn đang sử dụng MSVC, thì bạn chỉ cần "#include <memory>" (đối với gcc, tôi có CMake Find () để tìm kiếm để tôi có thể khai báo định nghĩa tiền xử lý để bao gồm <boost / shared_ptr.hpp> so với < tr1 / shared_ptr.h> là lựa chọn đầu tiên là tr1 trên boost - lưu ý rằng boost là "hpp" trong khi tr1 là ".h" - đã được xác minh trên Gentoo / Fedora / Debian - và tất nhiên cũng phải có #include <memory> để quản lý bộ nhớ riêng)
HidekiAI

Câu trả lời:


168

Có ít nhất ba nơi bạn có thể tìm thấy shared_ptr:

  1. Nếu triển khai C ++ của bạn hỗ trợ C ++ 11 (hoặc ít nhất là C ++ 11 shared_ptr), thì std::shared_ptrsẽ được định nghĩa trong <memory>.

  2. Nếu triển khai C ++ của bạn hỗ trợ các phần mở rộng thư viện C ++ TR1, thì std::tr1::shared_ptrcó thể sẽ nằm trong <memory>(Microsoft Visual C ++) hoặc <tr1/memory>(libstdc ++ của g ++). Boost cũng cung cấp một triển khai TR1 mà bạn có thể sử dụng.

  3. Nếu không, bạn có thể lấy và sử dụng thư viện Boost boost::shared_ptr, có thể tìm thấy trong <boost/shared_ptr.hpp>.


3
Đối với VS 2008, bạn đã nhận được "gói tính năng" hay bạn đã cài đặt SP1? Nếu vậy thì phần 2 ở đây áp dụng cho bạn, hãy sử dụng không gian tên tr1.
Kate Gregory

Cảm ơn. Điều này hoạt động giống như ma thuật. Tôi không biết tại sao, nhưng tôi đã bao gồm <memory> và <boost / tr1 / memory.hpp> và <boost / tr1 / tr1 / memory> trong khi tìm kiếm shared_ptr .. tất nhiên, tôi không thể. Cảm ơn một lần nữa.
Jake

Sau một thời gian ngắn rời khỏi C ++, tôi đã rất ngạc nhiên khi thấy rằng (trong clang v3.1) shared_ptrvẫn đang ở trong một tr1không gian tên. Bất kỳ suy nghĩ về điều này?
hiwaylon

3
@hiwaylon: Bạn đang biên dịch với -std=c++11?
James McNellis

@JamesMcNellis Yessir, rất tiếc điều đó đã gây ra một số điều không vui với các phần phụ thuộc khác và tôi không thể tiếp tục (do thời gian hạn chế). Nếu -std = c ++ 11 là thủ thuật, tôi có thể tự tin tiếp tục khi có thể quay lại dự án. Cảm ơn bạn.
hiwaylon


6

đối với VS2008 với bản cập nhật gói tính năng, shared_ptr có thể được tìm thấy trong không gian tên std :: tr1.

std::tr1::shared_ptr<int> MyIntSmartPtr = new int;

của

nếu bạn đã thêm đường dẫn cài đặt boost (ví dụ: @ C:\Program Files\Boost\boost_1_40_0) vào cài đặt IDE của mình:

#include <boost/shared_ptr.hpp>

3

Nếu your'e tìm bor tăng 's shared_ptr , bạn có thể dễ dàng tìm thấy câu trả lời bằng cách googling shared_ptr , theo các liên kết đến các tài liệu, và kéo lên một ví dụ làm việc hoàn toàn như này .

Trong mọi trường hợp, đây là một ví dụ làm việc hoàn chỉnh tối giản cho bạn mà tôi vừa mới hack:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

int main()
{
    boost::shared_ptr<MyGizmo> p(new MyGizmo);
    return 0;
}

Để #includetìm thấy tiêu đề, các thư viện rõ ràng cần phải nằm trong đường dẫn tìm kiếm. Trong MSVC, bạn đặt điều này trong Cài đặt dự án> Thuộc tính cấu hình> C / C ++> Thư mục bao gồm bổ sung. Trong trường hợp của tôi, điều này được đặt thànhC:\Program Files (x86)\boost\boost_1_42

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.