shared_ptr อยู่ที่ไหน


103

ตอนนี้ฉันรู้สึกหงุดหงิดมากหลังจากพยายามหาที่ตั้งของ shared_ptr อยู่หลายชั่วโมง ไม่มีตัวอย่างใดที่ฉันเห็นแสดงโค้ดที่สมบูรณ์เพื่อรวมส่วนหัวสำหรับshared_ptr(และใช้งานได้) เพียงแค่ระบุstd, tr1และ<memory>ไม่ได้ช่วยที่ทุกคน! ฉันดาวน์โหลดบูสต์แล้ว แต่ก็ยังไม่ปรากฏ! ใครช่วยบอกทีว่าหาได้ที่ไหน

ขอบคุณที่ให้ฉันระบายความผิดหวัง!

แก้ไข: ฉันเห็นว่าชื่อของฉันเปลี่ยนไป ขอโทษด้วยกับเรื่องนั้น. ดังนั้น ... มันยังเป็นเพราะฉันไม่ชัดเจนว่า shared_ptr "ขึ้นอยู่กับเวอร์ชัน C ++" -> นั่นเป็นสาเหตุที่ฉันไม่ระบุสภาพแวดล้อมของฉัน -> ดังนั้นจึงเป็นเรื่องยากสำหรับฉันที่จะค้นหามัน

ฉันกำลังทำงานกับ MSVS2008

แก้ไข 2: ฉันไม่รู้ว่าทำไม แต่ฉันรวม [memory] และ [boost / tr1 / memory.hpp] และ [boost / tr1 / tr1 / memory] ในขณะที่มองหา shared_ptr ทุกที่ .. แน่นอนฉันทำไม่ได้ 't.

ขอขอบคุณสำหรับการตอบสนองทุก.


3
อาจจะเป็นประโยชน์ถ้าคุณสามารถระบุการตั้งค่าของคุณได้อย่างถูกต้องเช่นคอมไพเลอร์และ
บูสต์

7
เว้นแต่คุณจะใช้ C ++ 0x shared_ptrไม่ใช่ส่วนหนึ่งของมาตรฐาน เป็นเรื่องปกติมากแม้ว่าบางคนจะถือว่าเป็นมาตรฐานแม้ว่าจะยังไม่เข้าก็ตาม
Billy ONeal

4
คุณคิดว่าเราควรตอบคำถามนี้ได้อย่างไรโดยไม่ทราบว่าสภาพแวดล้อมของคุณเป็น GCC สำหรับชิปเครื่องล้างจาน 7.5 บิตคอมไพเลอร์ที่เป็นกรรมสิทธิ์ของเมนเฟรม 128 บิตหรือ GCC เวอร์ชันของ XCode
sbi

เพียงเพื่อเพิ่มข้อมูลบางอย่างเกี่ยวกับปัญหาที่ฉันประสบ .. หากคุณต้องการรวบรวมด้วยมาตรฐาน c ++ 0x คุณต้องเพิ่ม "-std = c ++ 0x" เป็นอาร์กิวเมนต์ของ g ++
Mital Vora

1
หากคุณใช้ MSVC คุณเพียงแค่ต้อง "#include <memory>" (สำหรับ gcc ฉันมี CMake Find () สำหรับการค้นหาเพื่อที่ฉันจะสามารถประกาศคำจำกัดความของตัวประมวลผลล่วงหน้าเพื่อรวม <boost / shared_ptr.hpp> กับ < tr1 / shared_ptr.h> เป็นตัวเลือกแรกที่ tr1 มากกว่า boost - โปรดทราบว่า boost คือ "hpp" ในขณะที่ tr1 คือ ".h" - ยืนยันบน Gentoo / Fedora / Debian - และแน่นอนว่าต้องมี #include <memory> ด้วย สำหรับการจัดการหน่วยความจำแยกต่างหาก)
HidekiAI

คำตอบ:


168

มีสถานที่อย่างน้อยสามแห่งที่คุณอาจพบshared_ptr:

  1. หากการใช้งาน C ++ ของคุณรองรับ C ++ 11 (หรืออย่างน้อย C ++ 11 shared_ptr) std::shared_ptrจะถูกกำหนดในรูปแบบ<memory>.

  2. หากการใช้งาน C ++ ของคุณรองรับส่วนขยายไลบรารี C ++ TR1 ก็std::tr1::shared_ptrน่าจะอยู่ใน<memory>(Microsoft Visual C ++) หรือ<tr1/memory>(libstdc ++ ของ g ++) Boost ยังมีการใช้งาน TR1 ที่คุณสามารถใช้ได้

  3. มิฉะนั้นคุณสามารถรับไลบรารี Boost และใช้งานboost::shared_ptrได้ซึ่งสามารถพบได้ใน<boost/shared_ptr.hpp>ไฟล์.


3
สำหรับ VS 2008 คุณได้รับ "ชุดคุณลักษณะ" หรือคุณติดตั้ง SP1 หรือไม่ ถ้าเป็นอย่างนั้นส่วน 2 ที่นี่กับคุณใช้การ tr1namespace
Kate Gregory

ขอบคุณ. การทำงานนี้เหมือนเวทมนตร์ ฉันไม่รู้ว่าทำไม แต่ฉันใส่ <memory> และ <boost / tr1 / memory.hpp> และ <boost / tr1 / tr1 / memory> ในขณะที่มองหา shared_ptr ทุกที่ .. แน่นอนฉันทำไม่ได้ ขอบคุณอีกครั้ง.
เจ

หลังจากก้าวออกจาก C ++ ในช่วงสั้น ๆ ฉันรู้สึกประหลาดใจที่พบว่า (ในเสียงดัง v3.1) shared_ptrยังคงนั่งอยู่ในtr1เนมสเปซ มีความคิดเห็นเกี่ยวกับเรื่องนี้ไหม
hiwaylon

3
@hiwaylon: คุณรวบรวมด้วย-std=c++11?
James McNellis

@JamesMcNellis Yessir น่าเสียดายที่ทำให้เกิดความไม่พอใจกับการพึ่งพาอื่น ๆ และฉันไม่สามารถดำเนินการต่อได้ (กำหนดเวลา จำกัด ) ถ้า-std = c ++ 11เป็นเคล็ดลับฉันสามารถดำเนินการต่อด้วยความมั่นใจเมื่อฉันสามารถกลับไปที่โปรเจ็กต์ได้ ขอบคุณ.
hiwaylon


6

สำหรับ VS2008 ที่มีการอัปเดตชุดคุณลักษณะ shared_ptr สามารถพบได้ในเนมสเปซ std :: tr1

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

ของ

หากคุณมีการเพิ่มเส้นทางการติดตั้ง (เช่น @ C:\Program Files\Boost\boost_1_40_0) เพิ่มในการตั้งค่า IDE ของคุณ:

#include <boost/shared_ptr.hpp>

3

หาก your'e มอง Bor เพิ่ม 's shared_ptrคุณจะได้พบคำตอบได้อย่างง่ายดายโดยgoogling shared_ptrต่อไปนี้การเชื่อมโยงไปยังเอกสารและดึงขึ้นตัวอย่างเช่นการทำงานที่สมบูรณ์แบบเช่นนี้

ไม่ว่าในกรณีใดต่อไปนี้เป็นตัวอย่างการทำงานที่เรียบง่ายสำหรับคุณซึ่งฉันเพิ่งแฮ็ก:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

เพื่อ#includeให้ค้นหาส่วนหัวได้เห็นได้ชัดว่าไลบรารีต้องอยู่ในเส้นทางการค้นหา ใน MSVC คุณตั้งค่านี้ในการตั้งค่าโครงการ> คุณสมบัติการกำหนดค่า> C / C ++> ไดเร็กทอรีรวมเพิ่มเติม ในกรณีของฉันสิ่งนี้ถูกตั้งค่าเป็นC:\Program Files (x86)\boost\boost_1_42

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.