Де поділяється_ptr?


103

Я так засмучений зараз через кілька годин, намагаючись знайти місце, де знаходиться спільний_ptr. Жоден із прикладів, які я бачу, не містить повного коду, щоб включити заголовки для shared_ptr(та працюючих). Просто констатуючи std, tr1і <memory>зовсім не допомагає! Я завантажив прискорення, і все, але все ще не відображається! Чи може хтось мені допомогти, точно сказавши, де його знайти?

Дякую за те, що дозволили мені випробовувати свої розчарування!

EDIT: Я бачу, що мій заголовок змінено. Вибач за це. Отже ... це було також тому, що мені було не ясно, що shared_ptr є "залежною від версії C ++" -> тому я не заявив про своє оточення -> тому, ймовірно, тому мені було так важко знайти його.

Я працюю над MSVS2008.

EDIT 2: Я не знаю чому, але я включав [пам'ять] і [boost / tr1 / memory.hpp] і [boost / tr1 / tr1 / memory], шукаючи всюди спільний_ptr .. звичайно, я не міг 'т.

Дякую за всі відповіді.


3
напевно, це буде корисно, якщо ви зможете правильно вказати налаштування, як, наприклад, який компілятор та збільшити версію / шлях встановлення
YeenFei

7
Якщо ви не на C ++ 0x, shared_ptrце не є частиною стандарту. Це настільки часто, хоча деякі вважатимуть його стандартним, хоча його ще немає.
Біллі ONeal

4
Як ви думаєте, як ми повинні відповісти на це запитання, не знаючи, чи є ваше середовище GCC для 7,5-бітового мікросхема посудомийної машини, фірмового компілятора 128-мейнфреймів або версії GCC XCode?
sbi

Просто додати інформацію про проблему, з якою я зіткнувся. Якщо ви хочете компілювати зі стандартом c ++ 0x, вам потрібно додати "-std = c ++ 0x" як аргумент g ++.
Mital Vora

1
Якщо ви перебуваєте в MSVC, тоді вам просто потрібно "#include <memory>" (для gcc у мене є пошук CMake () для пошуку, щоб я міг оголосити визначення препроцесора, щоб включати або <boost / shared_ptr.hpp> порівняно з < tr1 / shared_ptr.h> як перший вибір є tr1 над прискореним - зауважте, що прискорення "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>(g ++ 's libstdc ++). Boost також забезпечує реалізацію TR1, яку ви можете використовувати.

  3. В іншому випадку ви можете отримати бібліотеки Boost та використовувати їх boost::shared_ptr, які можна знайти в <boost/shared_ptr.hpp>.


3
Ви отримали пакет пакунків для VS 2008 чи встановили SP1? Якщо так, то частина 2 тут стосується вас, використовуйте простір імен tr1.
Кейт Григорій

Дякую. Це працює як магія. Я не знаю чому, але я включав <memory> і <boost / tr1 / memory.hpp> і <boost / tr1 / tr1 / memory>, шукаючи скрізь спільний_ptr .. звичайно, я не міг. Знову дякую.
Джейк

Недовго відійшовши від C ++, я здивовано виявив, що (у clang 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

Якщо ви дивитеся на boost boost '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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.