Где 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 .. конечно, я не мог т.

Спасибо за все ответы.

Джейк
источник
3
вероятно, будет полезно, если вы правильно
укажете
7
Если вы не используете C ++ 0x, shared_ptrэто не является частью стандарта. Однако это настолько распространено, что некоторые будут рассматривать его как стандарт, даже если его еще нет.
Билли Онил
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>(g ++ 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>, ища повсюду shared_ptr .. конечно, я не мог. Еще раз спасибо.
Джейк,
Отойдя ненадолго от C ++, я был удивлен, обнаружив, что (в clang v3.1) shared_ptrвсе еще находится в tr1пространстве имен. Есть мысли по этому поводу?
hiwaylon 08
3
@hiwaylon: Вы компилируете -std=c++11?
Джеймс МакНеллис
@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>
YeenFei
источник
3

Если your'e ищет БОР подталкивания «s shared_ptr , вы могли бы легко найти ответ на прибегая к помощи 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

Джон Диблинг
источник