¿Dónde está shared_ptr?

103

Estoy tan frustrado en este momento después de varias horas tratando de encontrar dónde se encuentra shared_ptr. Ninguno de los ejemplos que veo muestra un código completo para incluir los encabezados shared_ptr(y en funcionamiento). Simplemente diciendo std, ¡ tr1y <memory>no está ayudando en absoluto! ¡He descargado potenciadores y todo, pero aún no aparece! ¿Alguien puede ayudarme diciéndome exactamente dónde encontrarlo?

¡Gracias por dejarme desahogar mis frustraciones!

EDITAR: Veo que mi título ha sido cambiado. Lo siento por eso. Entonces ... también fue porque no estaba claro para mí que shared_ptr es "dependiente de la versión C ++" -> por eso no indiqué mi entorno -> por lo tanto, probablemente por qué fue tan difícil para mí encontrarlo.

Estoy trabajando en MSVS2008.

EDIT 2: No sé por qué, pero estaba incluyendo [memory] y [boost / tr1 / memory.hpp] y [boost / tr1 / tr1 / memory] mientras buscaba en todas partes el shared_ptr ... por supuesto, no pude 't.

Gracias por todas las respuestas.

Jake
fuente
3
probablemente será útil si puede indicar su configuración correctamente, como qué compilador y versión de impulso / ruta de instalación
YeenFei
7
A menos que esté en C ++ 0x, shared_ptrno es parte del estándar. Sin embargo, es tan común que algunos lo tratarán como estándar aunque aún no lo esté.
Billy ONeal
4
¿Cómo cree que deberíamos responder a esta pregunta sin saber si su entorno es GCC para un chip lavavajillas de 7,5 bits, un compilador propietario de un mainframe de 128 bits o la versión de GCC de XCode?
sbi
Solo para agregar algo de información sobre el problema que enfrenté .. Si desea compilar con el estándar c ++ 0x, debe agregar "-std = c ++ 0x" como argumento de g ++.
Mital Vora
1
Si está en MSVC, solo necesita "#include <memory>" (para gcc, tengo un CMake Find () para buscar, de modo que pueda declarar la definición del preprocesador para incluir <boost / shared_ptr.hpp> versus < tr1 / shared_ptr.h> como primera opción siendo tr1 sobre boost - tenga en cuenta que boost es "hpp" mientras que tr1 es ".h" - verificado en Gentoo / Fedora / Debian - y por supuesto asegúrese de tener también #include <memory> para la gestión de la memoria por separado)
HidekiAI

Respuestas:

168

Hay al menos tres lugares donde puede encontrar shared_ptr:

  1. Si su implementación de C ++ admite C ++ 11 (o al menos C ++ 11 shared_ptr), entonces std::shared_ptrse definirá en <memory>.

  2. Si su implementación de C ++ admite las extensiones de la biblioteca C ++ TR1, std::tr1::shared_ptrprobablemente estará en <memory>(Microsoft Visual C ++) o <tr1/memory>(g ++ 's libstdc ++). Boost también proporciona una implementación de TR1 que puede utilizar.

  3. De lo contrario, puede obtener las bibliotecas de Boost y su uso boost::shared_ptr, que se pueden encontrar en <boost/shared_ptr.hpp>.

James McNellis
fuente
3
Para VS 2008, ¿obtuvo el "paquete de características" o instaló SP1? Si es así, entonces la parte 2 aquí se aplica a usted, use el espacio de nombres tr1.
Kate Gregory
Gracias. Esto funciona como por arte de magia. No sé por qué, pero estaba incluyendo <memory> y <boost / tr1 / memory.hpp> y <boost / tr1 / tr1 / memory> mientras buscaba por todas partes el shared_ptr ... por supuesto, no pude. Gracias de nuevo.
Jake
Después de haberme alejado brevemente de C ++, me sorprendió descubrir que (en clang v3.1) shared_ptrtodavía estaba en un tr1espacio de nombres. Tiene alguna idea sobre esto?
hiwaylon
3
@hiwaylon: ¿Estás compilando con -std=c++11?
James McNellis
@JamesMcNellis Yessir, desafortunadamente eso causó cierta infelicidad con otras dependencias y no pude continuar (dadas las limitaciones de tiempo). Si -std = c ++ 11 es el truco, puedo continuar con confianza cuando pueda volver al proyecto. Gracias.
hiwaylon
6

para VS2008 con la actualización del paquete de características, shared_ptr se puede encontrar en el espacio de nombres std :: tr1.

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

de

si se C:\Program Files\Boost\boost_1_40_0agregó la ruta de instalación de impulso (por ejemplo @ ) a la configuración de su IDE:

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

Si estás por buscar bor impulso 's shared_ptr , que podría haber encontrado fácilmente la respuesta por googlear shared_ptr , siguiendo los enlaces a los documentos, y tirando hacia arriba de un ejemplo de trabajo completo como este .

En cualquier caso, aquí hay un ejemplo de trabajo completo minimalista para ti que acabo de piratear:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Para #includeque encuentre el encabezado, las bibliotecas obviamente deben estar en la ruta de búsqueda. En MSVC, establezca esto en Configuración del proyecto> Propiedades de configuración> C / C ++> Directorios de inclusión adicionales. En mi caso, esto está configurado paraC:\Program Files (x86)\boost\boost_1_42

John Dibling
fuente