Onde está shared_ptr?

103

Estou muito frustrado agora, depois de várias horas tentando descobrir onde shared_ptr está localizado. Nenhum dos exemplos que vejo mostra código completo para incluir os cabeçalhos para shared_ptr(e funcionando). Simplesmente afirmando std, tr1e <memory>não está ajudando em nada! Eu baixei boosts e tudo, mas ainda não aparece! Alguém pode me ajudar dizendo exatamente onde encontrá-lo?

Obrigado por me deixar desabafar minhas frustrações!

EDITAR: vejo que meu título foi alterado. Me desculpe por isso. Então ... foi também porque não estava claro para mim que shared_ptr é "dependente da versão C ++" -> é por isso que eu não indiquei meu ambiente -> provavelmente porque foi tão difícil para mim encontrá-lo.

Estou trabalhando no MSVS2008.

EDIT 2: Não sei por quê, mas incluí [memory] e [boost / tr1 / memory.hpp] e [boost / tr1 / tr1 / memory] enquanto procurava por shared_ptr em todos os lugares. Claro, não consegui 't.

Obrigado por todas as respostas.

Jake
fonte
3
provavelmente será útil se você puder declarar sua configuração corretamente, como qual compilador e versão de reforço / caminho de instalação
YeenFei
7
A menos que você esteja em C ++ 0x, shared_ptrnão faz parte do padrão. É tão comum que alguns vão tratá-lo como padrão, embora ainda não esteja disponível.
Billy ONeal
4
Como você acha que devemos responder a essa pergunta sem saber se o seu ambiente é GCC para um chip de máquina de lavar louça de 7,5 bits, um compilador proprietário de um mainframe de 128 bits ou a versão XCode do GCC?
sbi
Apenas para adicionar algumas informações sobre o problema que enfrentei .. Se você deseja compilar com o padrão c ++ 0x você precisa adicionar "-std = c ++ 0x" como argumento de g ++.
Mital Vora
1
Se você estiver no MSVC, então você só precisa de "#include <memory>" (para gcc, eu tenho um CMake Find () para pesquisar para que eu possa declarar a definição do pré-processador para incluir <boost / shared_ptr.hpp> versus < tr1 / shared_ptr.h> como primeira escolha sendo tr1 em vez de boost - note que boost é "hpp" enquanto tr1 é ".h" - verificado em Gentoo / Fedora / Debian - e claro, certifique-se de ter também #include <memory> para gerenciamento de memória separadamente)
HidekiAI

Respostas:

168

Existem pelo menos três lugares onde você pode encontrar shared_ptr:

  1. Se os seus C ++ apoia a implementação C ++ 11 (ou pelo menos o C ++ 11 shared_ptr), em seguida, std::shared_ptrserão definidos em <memory>.

  2. Se a sua implementação C ++ suportar as extensões de biblioteca C ++ TR1, std::tr1::shared_ptrprovavelmente será em <memory>(Microsoft Visual C ++) ou <tr1/memory>(g ++ 's libstdc ++). O Boost também fornece uma implementação TR1 que você pode usar.

  3. Caso contrário, você pode obter as bibliotecas Boost e usar boost::shared_ptr, que podem ser encontradas em <boost/shared_ptr.hpp>.

James McNellis
fonte
3
Para o VS 2008, você obteve o "feature pack" ou instalou o SP1? Nesse caso, a parte 2 aqui se aplica a você, use o namespace tr1.
Kate Gregory
Obrigado. Isso funciona como mágica. Eu não sei por que, mas eu estava incluindo <memory> e <boost / tr1 / memory.hpp> e <boost / tr1 / tr1 / memory> enquanto procurava por shared_ptr em todos os lugares. Claro, não consegui. Obrigado novamente.
Jake
Depois de me afastar do C ++ brevemente, fiquei surpreso ao descobrir que (no clang v3.1) shared_ptrainda estava em um tr1namespace. Alguma opinião sobre isso?
hiwaylon
3
@hiwaylon: Você está compilando com -std=c++11?
James McNellis
@JamesMcNellis Sim senhor, infelizmente isso causou certa infelicidade com outras dependências e não consegui continuar (devido às restrições de tempo). Se -std = c ++ 11 for o truque, poderei continuar com confiança quando puder retornar ao projeto. Obrigado.
hiwaylon
6

para VS2008 com atualização de feature pack, shared_ptr pode ser encontrado no namespace std :: tr1.

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

do

se você tiver o caminho de instalação do boost (por exemplo @ C:\Program Files\Boost\boost_1_40_0) adicionado às configurações do IDE:

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

Se você está procurando o shared_ptr do impulso de bor boost , poderia facilmente encontrar a resposta pesquisando shared_ptr no Google , seguindo os links para os documentos e obtendo um exemplo funcional completo como este .

Em qualquer caso, aqui está um exemplo de trabalho minimalista completo para você que acabei de hackear:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Para que o #includeencontre o cabeçalho, as bibliotecas obviamente precisam estar no caminho de pesquisa. No MSVC, você define isso em Configurações do projeto> Propriedades de configuração> C / C ++> Diretórios de inclusão adicionais. No meu caso, isso é definido comoC:\Program Files (x86)\boost\boost_1_42

John Dibling
fonte