Di mana shared_ptr?

103

Saya sangat frustrasi sekarang setelah beberapa jam mencoba menemukan di mana shared_ptr berada. Tak satu pun dari contoh yang saya lihat menunjukkan kode lengkap untuk menyertakan header shared_ptr(dan berfungsi). Cukup menyatakan std, tr1dan <memory>tidak membantu sama sekali! Saya telah mengunduh penguat dan semuanya tetapi tetap tidak muncul! Dapatkah seseorang membantu saya dengan memberi tahu di mana tepatnya menemukannya?

Terima kasih telah membiarkan saya melampiaskan frustrasi saya!

EDIT: Saya melihat judul saya telah diubah. Maaf soal itu. Jadi ... itu juga karena tidak jelas bagi saya bahwa shared_ptr adalah "C ++ version dependent" -> itulah mengapa saya tidak menyatakan lingkungan saya -> oleh karena itu mungkin mengapa sangat sulit bagi saya untuk menemukannya.

Saya sedang mengerjakan MSVS2008.

EDIT 2: Saya tidak tahu mengapa, tetapi saya menyertakan [memory] dan [boost / tr1 / memory.hpp] dan [boost / tr1 / tr1 / memory] sambil mencari di mana-mana untuk shared_ptr .. tentu saja, saya tidak bisa t.

Terima kasih atas semua tanggapannya.

Jake
sumber
3
mungkin akan sangat membantu jika Anda dapat menyatakan pengaturan Anda dengan benar, seperti kompiler apa dan meningkatkan versi / jalur instalasi
YeenFei
7
Kecuali Anda menggunakan C ++ 0x, shared_ptrini bukan bagian dari standar. Ini sangat umum sehingga beberapa orang akan menganggapnya sebagai standar meskipun belum ada.
Billy ONeal
4
Menurut Anda, bagaimana kami harus menjawab pertanyaan ini tanpa mengetahui apakah lingkungan Anda adalah GCC untuk chip pencuci piring 7,5bit, kompiler berpemilik mainframe 128bit, atau GCC versi XCode?
sbi
Hanya untuk menambahkan beberapa info tentang masalah yang saya hadapi .. Jika Anda ingin mengkompilasi dengan standar c ++ 0x Anda perlu menambahkan "-std = c ++ 0x" sebagai argumen g ++.
Mital Vora
1
Jika Anda menggunakan MSVC, Anda hanya perlu "#include <memory>" (untuk gcc, saya memiliki CMake Find () untuk menelusuri sehingga saya dapat mendeklarasikan definisi preprocessor untuk menyertakan <boost / shared_ptr.hpp> versus < tr1 / shared_ptr.h> sebagai pilihan pertama adalah tr1 daripada boost - perhatikan bahwa boost adalah "hpp" sedangkan tr1 adalah ".h" - diverifikasi di Gentoo / Fedora / Debian - dan tentu saja pastikan juga #include <memory> untuk manajemen memori secara terpisah)
HidekiAI

Jawaban:

168

Setidaknya ada tiga tempat di mana Anda dapat menemukan shared_ptr:

  1. Jika implementasi C ++ Anda mendukung C ++ 11 (atau setidaknya C ++ 11 shared_ptr), maka std::shared_ptrakan ditentukan di <memory>.

  2. Jika implementasi C ++ Anda mendukung ekstensi pustaka C ++ TR1, std::tr1::shared_ptrkemungkinan besar akan berada di <memory>(Microsoft Visual C ++) atau <tr1/memory>(g ++'s libstdc ++). Boost juga menyediakan implementasi TR1 yang dapat Anda gunakan.

  3. Jika tidak, Anda dapat memperoleh pustaka dan penggunaan Boost boost::shared_ptr, yang dapat ditemukan di <boost/shared_ptr.hpp>.

James McNellis
sumber
3
Untuk VS 2008, apakah Anda mendapatkan "paket fitur" atau apakah Anda menginstal SP1? Jika demikian, maka bagian 2 di sini berlaku untuk Anda, gunakan namespace tr1.
Kate Gregory
Terima kasih. Ini bekerja seperti sulap. Saya tidak tahu mengapa, tetapi saya menyertakan <memory> dan <boost / tr1 / memory.hpp> dan <boost / tr1 / tr1 / memory> sambil mencari di mana-mana untuk shared_ptr .. tentu saja, saya tidak bisa. Terima kasih lagi.
Jake
Setelah menjauh dari C ++ sebentar saya terkejut menemukan bahwa (di clang v3.1) shared_ptrmasih duduk di tr1namespace. Ada pemikiran tentang ini?
hiwaylon
3
@hiwaylon: Apakah Anda sedang melakukan kompilasi -std=c++11?
James McNellis
@JamesMcNellis Yessir, sayangnya itu menyebabkan beberapa ketidakbahagiaan dengan dependensi lain dan saya tidak dapat melanjutkan (mengingat batasan waktu). Jika -std = c ++ 11 adalah triknya, saya dapat melanjutkan dengan percaya diri ketika saya dapat kembali ke proyek. Terima kasih.
hiwaylon
6

untuk VS2008 dengan pembaruan paket fitur, shared_ptr dapat ditemukan di namespace std :: tr1.

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

dari

jika Anda telah meningkatkan jalur instalasi (misalnya @ C:\Program Files\Boost\boost_1_40_0) ditambahkan ke pengaturan IDE Anda:

#include <boost/shared_ptr.hpp>
YeenFei
sumber
3

Jika your'e mencari bor dorongan 's shared_ptr , Anda bisa dengan mudah menemukan jawaban dengan googling shared_ptr , berikut link ke dokumen, dan menarik sebuah contoh kerja yang lengkap seperti ini .

Bagaimanapun, berikut adalah contoh kerja lengkap minimalis untuk Anda yang baru saja saya retas:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Untuk #includemenemukan tajuk, perpustakaan jelas harus berada di jalur pencarian. Di MSVC, Anda mengatur ini di Pengaturan Proyek> Properti Konfigurasi> C / C ++> Direktori Sertakan Tambahan. Dalam kasus saya, ini diatur keC:\Program Files (x86)\boost\boost_1_42

John Dibling
sumber