Où est shared_ptr?

103

Je suis tellement frustré en ce moment après plusieurs heures à essayer de trouver où se trouve shared_ptr. Aucun des exemples que je vois ne montre le code complet pour inclure les en-têtes pour shared_ptr(et le travail). Disant simplement std, tr1et <memory>n'aide pas du tout! J'ai téléchargé des boosts et tout cela n'apparaît toujours pas! Quelqu'un peut-il m'aider en me disant exactement où le trouver?

Merci de me laisser exprimer mes frustrations!

EDIT: Je vois que mon titre a été changé. Désolé pour ça. Donc ... c'était aussi parce qu'il n'était pas clair pour moi que shared_ptr est "dépendant de la version C ++" -> c'est pourquoi je n'ai pas indiqué mon environnement -> donc probablement pourquoi il était si difficile pour moi de le trouver.

Je travaille sur MSVS2008.

EDIT 2: Je ne sais pas pourquoi, mais j'incluais [memory] et [boost / tr1 / memory.hpp] et [boost / tr1 / tr1 / memory] en cherchant partout le shared_ptr .. bien sûr, je ne pourrais pas 't.

Merci pour toutes les réponses.

Jake
la source
3
il sera probablement utile si vous pouvez énoncer correctement votre configuration, comme quel compilateur et booster la version / le chemin d'installation
YeenFei
7
Sauf si vous êtes sur C ++ 0x, shared_ptrne fait pas partie de la norme. C'est si courant que certains le traiteront comme standard même si ce n'est pas encore le cas.
Billy ONeal
4
Comment pensez-vous que nous devrions répondre à cette question sans savoir si votre environnement est GCC pour une puce de lave-vaisselle 7,5 bits, le compilateur propriétaire d'un mainframe 128 bits ou la version XCode de GCC?
sbi
Juste pour ajouter quelques informations sur le problème auquel j'ai été confronté .. Si vous voulez compiler avec la norme c ++ 0x, vous devez ajouter "-std = c ++ 0x" comme argument de g ++.
Mital Vora
1
Si vous êtes sur MSVC, alors vous avez juste besoin de "#include <memory>" (pour gcc, j'ai un CMake Find () pour la recherche afin que je puisse déclarer la définition du préprocesseur pour inclure soit <boost / shared_ptr.hpp> contre < tr1 / shared_ptr.h> comme premier choix étant tr1 sur boost - notez que boost est "hpp" tandis que tr1 est ".h" - vérifié sur Gentoo / Fedora / Debian - et bien sûr assurez-vous d'avoir aussi #include <memory> pour la gestion de la mémoire séparément)
HidekiAI

Réponses:

168

Il y a au moins trois endroits où vous pouvez trouver shared_ptr:

  1. Si votre implémentation C ++ prend en charge C ++ 11 (ou au moins le C ++ 11 shared_ptr), alors std::shared_ptrsera défini dans <memory>.

  2. Si votre implémentation C ++ prend en charge les extensions de bibliothèque C ++ TR1, alors std::tr1::shared_ptrsera probablement dans <memory>(Microsoft Visual C ++) ou <tr1/memory>(g ++ 's libstdc ++). Boost fournit également une implémentation TR1 que vous pouvez utiliser.

  3. Sinon, vous pouvez obtenir les bibliothèques Boost et les utiliser boost::shared_ptr, qui se trouvent dans <boost/shared_ptr.hpp>.

James McNellis
la source
3
Pour VS 2008, avez-vous obtenu le «pack de fonctionnalités» ou avez-vous installé SP1? Si tel est le cas, la partie 2 s'applique ici à vous, utilisez l'espace de noms tr1.
Kate Gregory
Merci. Cela fonctionne comme par magie. Je ne sais pas pourquoi, mais j'incluais <memory> et <boost / tr1 / memory.hpp> et <boost / tr1 / tr1 / memory> tout en cherchant partout le shared_ptr .. bien sûr, je ne pouvais pas. Merci encore.
Jake
Après m'être brièvement éloigné du C ++, j'ai été surpris de constater que (dans clang v3.1) shared_ptrétait toujours assis dans un tr1espace de noms. Des pensées à ce sujet?
hiwaylon
3
@hiwaylon: Compilez-vous avec -std=c++11?
James McNellis
@JamesMcNellis Yessir, malheureusement cela a causé un certain mécontentement avec d'autres dépendances et je n'ai pas pu continuer (compte tenu des contraintes de temps). Si -std = c ++ 11 est l'astuce, je peux continuer en toute confiance lorsque je pourrai revenir au projet. Je vous remercie.
hiwaylon
6

pour VS2008 avec mise à jour du pack de fonctionnalités, shared_ptr se trouve sous l'espace de noms std :: tr1.

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

de

si vous aviez un chemin d'installation boost (par exemple @ C:\Program Files\Boost\boost_1_40_0) ajouté à vos paramètres IDE:

#include <boost/shared_ptr.hpp>
YeenFei
la source
3

Si your'e recherche bor boost de » l'shared_ptr vous auriez pu facilement trouvé, la réponse par googler shared_ptr , en suivant les liens vers la documentation, et en tirant un exemple de travail complet tel que cela .

Dans tous les cas, voici un exemple de travail complet et minimaliste pour vous que je viens de pirater:

#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

Pour que le #includetrouve l'en-tête, les bibliothèques doivent évidemment se trouver dans le chemin de recherche. Dans MSVC, vous définissez cela dans Paramètres du projet> Propriétés de configuration> C / C ++> Répertoires inclus supplémentaires. Dans mon cas, c'est réglé surC:\Program Files (x86)\boost\boost_1_42

John Dibling
la source