Wo ist shared_ptr?

103

Ich bin gerade so frustriert, nachdem ich mehrere Stunden lang versucht habe herauszufinden, wo sich shared_ptr befindet. Keines der Beispiele, die ich sehe, zeigt vollständigen Code, der die Überschriften für shared_ptr(und das Arbeiten) enthält. Einfach gesagt std, tr1und <memory>hilft überhaupt nicht! Ich habe Boosts heruntergeladen und alles, aber es wird immer noch nicht angezeigt! Kann mir jemand helfen, indem er genau sagt, wo ich es finde?

Danke, dass ich meine Frustrationen ablassen durfte!

EDIT: Ich sehe, mein Titel wurde geändert. Das tut mir leid. Also ... es lag auch daran, dass mir nicht klar war, dass shared_ptr "C ++ - versionabhängig" ist -> deshalb habe ich meine Umgebung nicht angegeben -> daher wahrscheinlich, warum es für mich so schwierig war, sie zu finden.

Ich arbeite an MSVS2008.

EDIT 2: Ich weiß nicht warum, aber ich habe [memory] und [boost / tr1 / memory.hpp] und [boost / tr1 / tr1 / memory] eingeschlossen, während ich überall nach dem shared_ptr gesucht habe. Natürlich konnte ich nicht 't.

Vielen Dank für alle Antworten.

Jake
quelle
3
Wahrscheinlich ist es hilfreich, wenn Sie Ihr Setup korrekt
angeben
7
Sofern Sie nicht mit C ++ 0x arbeiten, shared_ptrist dies nicht Teil des Standards. Es ist jedoch so häufig, dass einige es als Standard behandeln, obwohl es noch nicht vorhanden ist.
Billy ONeal
4
Wie sollten wir diese Frage beantworten, ohne zu wissen, ob Ihre Umgebung GCC für einen 7,5-Bit-Geschirrspülerchip, den proprietären Compiler eines 128-Bit-Mainframes oder die XCode-Version von GCC ist?
sbi
Nur um einige Informationen über das Problem hinzuzufügen, mit dem ich konfrontiert war. Wenn Sie mit dem Standard c ++ 0x kompilieren möchten, müssen Sie "-std = c ++ 0x" als Argument von g ++ hinzufügen.
Mital Vora
1
Wenn Sie mit MSVC arbeiten, benötigen Sie nur "#include <Speicher>" (für gcc habe ich eine CMake-Suche () für die Suche, damit ich die Präprozessordefinition so deklarieren kann, dass sie entweder <boost / shared_ptr.hpp> oder <enthält tr1 / shared_ptr.h> als erste Wahl ist tr1 over boost - beachten Sie, dass boost "hpp" ist, während tr1 ".h" ist - überprüft auf Gentoo / Fedora / Debian - und stellen Sie sicher, dass Sie auch #include <memory> haben für Speicherverwaltung separat)
HidekiAI

Antworten:

168

Es gibt mindestens drei Orte, an denen Sie möglicherweise finden shared_ptr:

  1. Wenn Ihre C ++ - Implementierung C ++ 11 (oder zumindest C ++ 11 shared_ptr) unterstützt, std::shared_ptrwird dies in definiert <memory>.

  2. Wenn Ihre C ++ - Implementierung die C ++ TR1-Bibliothekserweiterungen unterstützt, befindet sie std::tr1::shared_ptrsich wahrscheinlich in <memory>(Microsoft Visual C ++) oder <tr1/memory>(libstdc ++ von g ++). Boost bietet auch eine TR1-Implementierung, die Sie verwenden können.

  3. Andernfalls können Sie die Boost-Bibliotheken erhalten und verwenden boost::shared_ptr, die in zu finden sind <boost/shared_ptr.hpp>.

James McNellis
quelle
3
Haben Sie für VS 2008 das "Feature Pack" erhalten oder SP1 installiert? Wenn ja, dann gilt Teil 2 für Sie. Verwenden Sie den Namespace tr1.
Kate Gregory
Vielen Dank. Das funktioniert wie Magie. Ich weiß nicht warum, aber ich habe <memory> und <boost / tr1 / memory.hpp> und <boost / tr1 / tr1 / memory> eingeschlossen, während ich überall nach dem shared_ptr gesucht habe. Natürlich konnte ich nicht. Danke noch einmal.
Jake
Nachdem ich mich kurz von C ++ entfernt hatte, stellte ich überrascht fest, dass (in Clang v3.1) shared_ptrimmer noch in einem tr1Namespace saß . Irgendwelche Gedanken dazu?
Hiwaylon
3
@hiwaylon: Kompilierst du mit -std=c++11?
James McNellis
@JamesMcNellis Yessir, leider verursachte dies einige Unzufriedenheit mit anderen Abhängigkeiten und ich konnte nicht fortfahren (gegebene Zeitbeschränkungen). Wenn -std = c ++ 11 der Trick ist, kann ich mit Zuversicht fortfahren, wenn ich zum Projekt zurückkehren kann. Danke dir.
Hiwaylon
6

Für VS2008 mit Feature Pack-Update finden Sie shared_ptr unter dem Namespace std :: tr1.

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

von

Wenn Sie C:\Program Files\Boost\boost_1_40_0Ihren IDE-Einstellungen einen Boost-Installationspfad (z. B. @ ) hinzugefügt haben:

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

Wenn your'e bor suchen boost ‚s shared_ptr , Sie bequem die Antwort konnte durch gefunden googeln shared_ptr , die Links zu den Dokumenten, und ein komplettes Arbeits Beispiel wie oben ziehen diese .

Auf jeden Fall ist hier ein minimalistisches vollständiges Arbeitsbeispiel für Sie, das ich gerade gehackt habe:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Damit #includeder Header gefunden werden kann, müssen sich die Bibliotheken offensichtlich im Suchpfad befinden. In MSVC legen Sie dies unter Projekteinstellungen> Konfigurationseigenschaften> C / C ++> Zusätzliche Einschlussverzeichnisse fest. In meinem Fall ist dies auf eingestelltC:\Program Files (x86)\boost\boost_1_42

John Dibling
quelle