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.


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>.


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>

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.