Gdzie jest shared_ptr?

103

Jestem bardzo sfrustrowany po kilku godzinach prób znalezienia lokalizacji shared_ptr. Żaden z przykładów, które widzę, nie pokazuje pełnego kodu zawierającego nagłówki shared_ptr(i działające). Po prostu stwierdzając std, tr1i <memory>nie pomaga w ogóle! Pobrałem doładowania i wszystko, ale nadal się nie pojawiają! Czy ktoś może mi pomóc, podając dokładnie, gdzie go znaleźć?

Dzięki, że pozwoliłeś mi dać upust mojej frustracji!

EDYCJA: Widzę, że mój tytuł został zmieniony. Przepraszam za to. Więc ... to również dlatego, że nie było dla mnie jasne, że shared_ptr jest "zależne od wersji C ++" -> dlatego nie podałem mojego środowiska -> dlatego prawdopodobnie dlatego było mi tak trudno je znaleźć.

Pracuję na MSVS2008.

EDYCJA 2: Nie wiem dlaczego, ale włączyłem [memory] i [boost / tr1 / memory.hpp] i [boost / tr1 / tr1 / memory], szukając wszędzie Shared_ptr .. oczywiście nie mogłem 't.

Dzięki za wszystkie odpowiedzi.

Jake
źródło
3
prawdopodobnie będzie pomocne, jeśli możesz poprawnie określić swoją konfigurację, na przykład jaki kompilator i wersję boost / ścieżkę instalacji
YeenFei
7
Chyba że jesteś na C ++ 0x, shared_ptrnie jest częścią standardu. Jest to jednak tak powszechne, że niektórzy będą traktować to jako standard, mimo że jeszcze go nie ma.
Billy ONeal
4
Jak myślisz, jak powinniśmy odpowiedzieć na to pytanie, nie wiedząc, czy twoje środowisko to GCC dla 7,5-bitowego chipa zmywarki, 128-bitowego kompilatora mainframe, czy też wersja GCC XCode?
sbi
Żeby dodać trochę informacji o problemie, z którym miałem do czynienia. Jeśli chcesz kompilować w standardzie c ++ 0x, musisz dodać „-std = c ++ 0x” jako argument g ++.
Mital Vora
1
Jeśli korzystasz z MSVC, potrzebujesz tylko "#include <memory>" (dla gcc mam CMake Find () do wyszukiwania, więc mogę zadeklarować definicję preprocesora, aby zawierała <boost / shared_ptr.hpp> versus < tr1 / shared_ptr.h> jako pierwszy wybór to tr1 zamiast boost - zauważ, że boost to "hpp", podczas gdy tr1 to ".h" - sprawdzone w Gentoo / Fedorze / Debianie - i oczywiście upewnij się, że masz również #include <memory> do zarządzania pamięcią oddzielnie)
HidekiAI

Odpowiedzi:

168

Są co najmniej trzy miejsca, w których możesz znaleźć shared_ptr:

  1. Jeśli Twoja implementacja C ++ obsługuje C ++ 11 (lub przynajmniej C ++ 11 shared_ptr), std::shared_ptrzostanie zdefiniowana w <memory>.

  2. Jeśli Twoja implementacja C ++ obsługuje rozszerzenia biblioteki C ++ TR1, std::tr1::shared_ptrprawdopodobnie będzie to <memory>(Microsoft Visual C ++) lub <tr1/memory>(libstdc ++ g ++). Boost zapewnia również implementację TR1, której możesz użyć.

  3. W przeciwnym razie możesz uzyskać biblioteki Boost i użyć boost::shared_ptr, które można znaleźć w <boost/shared_ptr.hpp>.

James McNellis
źródło
3
Czy w przypadku VS 2008 otrzymałeś „pakiet funkcji”, czy zainstalowałeś dodatek SP1? Jeśli tak, to część 2 tutaj dotyczy Ciebie, użyj przestrzeni nazw tr1.
Kate Gregory
Dzięki. To działa jak magia. Nie wiem dlaczego, ale włączyłem <memory> i <boost / tr1 / memory.hpp> i <boost / tr1 / tr1 / memory>, szukając wszędzie shared_ptr ... oczywiście nie mogłem. Dzięki jeszcze raz.
Jake
Po krótkim odejściu od C ++ byłem zaskoczony, że (w clang v3.1) shared_ptrnadal znajduje się w tr1przestrzeni nazw. Jakieś przemyślenia na ten temat?
hiwaylon
3
@hiwaylon: Czy kompilujesz z -std=c++11?
James McNellis
@JamesMcNellis Yessir, niestety spowodowało to niezadowolenie z innych zależności i nie mogłem kontynuować (biorąc pod uwagę ograniczenia czasowe). Jeśli -std = c ++ 11 jest sztuczką, mogę kontynuować z pewnością, kiedy będę mógł wrócić do projektu. Dziękuję Ci.
hiwaylon
6

dla VS2008 z aktualizacją pakietu funkcji shared_ptr można znaleźć w przestrzeni nazw std :: tr1.

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

z

jeśli masz przyspieszoną ścieżkę instalacji (na przykład @ C:\Program Files\Boost\boost_1_40_0) dodaną do ustawień IDE:

#include <boost/shared_ptr.hpp>
YeenFei
źródło
3

Jeśli your'e patrząc BOR impuls „s shared_ptr , mogłeś łatwo znaleźć odpowiedź przez googlowania shared_ptr po linki do docs i podjeżdżaniu kompletny przykład roboczych, takich jak ten .

W każdym razie, oto minimalistyczny, kompletny przykład roboczy, który właśnie zhakowałem:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Aby program #includemógł znaleźć nagłówek, biblioteki muszą oczywiście znajdować się w ścieżce wyszukiwania. W MSVC ustaw to w ustawieniach projektu> właściwości konfiguracji> C / C ++> dodatkowe katalogi dołączania. W moim przypadku jest to ustawione naC:\Program Files (x86)\boost\boost_1_42

John Dibling
źródło