Dov'è shared_ptr?


103

Sono così frustrato in questo momento dopo diverse ore che provo a trovare dove si trova shared_ptr. Nessuno degli esempi che vedo mostra il codice completo per includere le intestazioni per shared_ptr(e funzionante). Semplicemente affermando std, tr1e <memory>non aiuta affatto! Ho scaricato potenziamenti e tutto ma ancora non viene visualizzato! Qualcuno può aiutarmi dicendomi esattamente dove trovarlo?

Grazie per avermi permesso di sfogare le mie frustrazioni!

EDIT: vedo che il mio titolo è stato cambiato. Mi dispiace per quello. Quindi ... è stato anche perché non mi era chiaro che shared_ptr è "dipendente dalla versione C ++" -> è per questo che non ho dichiarato il mio ambiente -> quindi probabilmente perché è stato così difficile per me trovarlo.

Sto lavorando su MSVS2008.

EDIT 2: Non so perché, ma stavo includendo [memory] e [boost / tr1 / memory.hpp] e [boost / tr1 / tr1 / memory] mentre cercavo dappertutto shared_ptr .. ovviamente, non potevo 't.

Grazie per tutte le risposte.


3
probabilmente sarà utile se puoi indicare correttamente la tua configurazione, ad esempio quale compilatore e versione boost / percorso di installazione
YeenFei

7
A meno che tu non sia su C ++ 0x, shared_ptrnon fa parte dello standard. È così comune però che alcuni lo considereranno come standard anche se non è ancora arrivato.
Billy ONeal

4
Come pensi che dovremmo rispondere a questa domanda senza sapere se il tuo ambiente è GCC per un chip per lavastoviglie a 7,5 bit, un compilatore proprietario di un mainframe a 128 bit o la versione XCode di GCC?
sbi

Solo per aggiungere alcune informazioni sul problema che ho dovuto affrontare .. Se vuoi compilare con lo standard c ++ 0x devi aggiungere "-std = c ++ 0x" come argomento di g ++.
Mital Vora

1
Se sei su MSVC, allora devi solo "#include <memory>" (per gcc, ho un CMake Find () per la ricerca in modo da poter dichiarare la definizione del preprocessore per includere <boost / shared_ptr.hpp> rispetto a < tr1 / shared_ptr.h> come prima scelta è tr1 su boost - nota che boost è "hpp" mentre tr1 è ".h" - verificato su Gentoo / Fedora / Debian - e ovviamente assicurati di avere anche #include <memory> per la gestione della memoria separatamente)
HidekiAI

Risposte:


168

Ci sono almeno tre posti dove puoi trovare shared_ptr:

  1. Se la tua implementazione C ++ supporta C ++ 11 (o almeno C ++ 11 shared_ptr), allora std::shared_ptrsarà definito in <memory>.

  2. Se la tua implementazione C ++ supporta le estensioni della libreria C ++ TR1, std::tr1::shared_ptrprobabilmente sarà in <memory>(Microsoft Visual C ++) o <tr1/memory>(g ++ 's libstdc ++). Boost fornisce anche un'implementazione TR1 che puoi usare.

  3. Altrimenti, puoi ottenere le librerie Boost e utilizzarle boost::shared_ptr, che puoi trovare in <boost/shared_ptr.hpp>.


3
Per VS 2008, hai ricevuto il "pacchetto di funzionalità" o hai installato SP1? In tal caso, la parte 2 qui si applica a te, usa lo spazio dei nomi tr1.
Kate Gregory

Grazie. Funziona come per magia. Non so perché, ma stavo includendo <memory> e <boost / tr1 / memory.hpp> e <boost / tr1 / tr1 / memory> mentre cercavo dappertutto shared_ptr .. ovviamente, non potevo. Grazie ancora.
Jake

Dopo essermi allontanato brevemente da C ++, sono stato sorpreso di scoprire che (in clang v3.1) shared_ptrera ancora seduto in uno tr1spazio dei nomi. Qualche idea su questo?
hiwaylon

3
@hiwaylon: stai compilando con -std=c++11?
James McNellis

@JamesMcNellis Yessir, sfortunatamente questo ha causato un po 'di infelicità con altre dipendenze e non sono stato in grado di continuare (dati i vincoli di tempo). Se -std = c ++ 11 è il trucco, posso continuare con sicurezza quando sarò in grado di tornare al progetto. Grazie.
hiwaylon


6

per VS2008 con aggiornamento del feature pack, shared_ptr può essere trovato in namespace std :: tr1.

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

di

se hai C:\Program Files\Boost\boost_1_40_0aggiunto il percorso di installazione boost (ad esempio @ ) alle tue impostazioni IDE:

#include <boost/shared_ptr.hpp>

3

Se your'e cercando bor spinta 's shared_ptr , si potrebbe avere facilmente trovato la risposta da googling shared_ptr , seguendo i link ai documenti, e tirando un esempio di lavoro completo, come questo .

In ogni caso, ecco un esempio funzionante completo minimalista per te che ho appena hackerato:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Affinché #includepossa trovare l'intestazione, le librerie devono ovviamente essere nel percorso di ricerca. In MSVC, puoi impostarlo in Impostazioni progetto> Proprietà di configurazione> C / C ++> Directory di inclusione aggiuntive. Nel mio caso, questo è impostato suC:\Program Files (x86)\boost\boost_1_42

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.