shared_ptr在哪里?

108

我现在非常沮丧,花了几个小时的时间来找寻shared_ptr的位置。我看到的所有示例都没有完整的代码来包括shared_ptr的头文件(并且能够正常工作)。仅仅说出stdtr1<memory>一点也没有帮助!我已经下载了boost,但它还是没有出现!能否有人告诉我确切的位置在哪里呢?

谢谢你让我吐槽我的挫败感!

编辑: 我看到我的标题已经被更改了。对此很抱歉。 所以......也因为我不清楚shared_ptr是"C++版本相关"的-->这就是为什么我没有说明我的环境-->因此可能是我很难找到的原因。

我正在使用MSVS2008。

编辑2: 我不知道为什么,在寻找shared_ptr的时候我同时包括[memory]、[boost/tr1/memory.hpp]和[boost/tr1/tr1/memory],当然,我找不到它。

感谢所有的回复。


3
如果您能正确说明您的设置,例如编译器和Boost版本/安装路径,那么这可能会很有帮助。 - YeenFei
7
除非你使用的是C++0x,否则shared_ptr不是标准的一部分。尽管如此,由于它非常常见,一些人会将其视为标准,即使它还没有被纳入标准。 - Billy ONeal
4
不知道您所使用的环境是7.5位洗碗机芯片的GCC,128位大型计算机专用编译器,还是XCode版本的GCC,我们该如何回答这个问题?请问您的想法是什么?为了回答这个问题,请您提供更多环境信息。 - sbi
只是补充一下我遇到的问题...如果你想使用c++0x标准进行编译,你需要将"-std=c++0x"作为g++的参数添加进去。 - Mital Vora
1
如果您使用的是MSVC,则只需要“#include <memory>”(对于gcc,我有一个CMake Find()用于搜索,以便我可以声明预处理器定义来包括< boost / shared_ptr.hpp >与< tr1 / shared_ptr.h>,首选项为tr1而不是boost-请注意,boost是“hpp”,而tr1是“.h”-在Gentoo / Fedora / Debian上进行了验证-当然,还要确保单独包含# include <memory>进行内存管理) - HidekiAI
4个回答

172

你可能会在至少三个地方找到shared_ptr

  1. 如果你的C++实现支持C++11(或至少支持C++11的shared_ptr),那么std::shared_ptr将会被定义在<memory>中。

  2. 如果你的C++实现支持C++ TR1库扩展,那么std::tr1::shared_ptr可能会在<memory>(Microsoft Visual C++)或<tr1/memory>(g++的libstdc++)中。Boost也提供了一个TR1实现,供你使用。

  3. 否则,你可以获取Boost库并使用boost::shared_ptr,可以在<boost/shared_ptr.hpp>中找到。


3
你是否安装了 VS 2008 的“功能包”或 SP1?如果是,则第 2 部分适用于你,使用命名空间 tr1 - Kate Gregory
谢谢。这就像魔法一样有效。我不知道为什么,但我在到处寻找shared_ptr时包含了<memory>和<boost/tr1/memory.hpp>以及<boost/tr1/tr1/memory>。当然,我找不到它。再次感谢。 - Jake
我暂时离开了C++,惊讶地发现(在clang v3.1中)shared_ptr仍然位于tr1命名空间中。对此有何想法? - hiwaylon
3
你是否在使用"-std=c++11"编译? - James McNellis
@JamesMcNellis 先生,不幸的是,这导致了其他依赖项的不满,并且由于时间限制,我无法继续。如果 -std=c++11 是解决方法,当我能够回到项目时,我可以有信心地继续。谢谢。 - hiwaylon
有点已经提到了,但是只有在将-std=c++11标志显式添加到g++版本5.3.1后,才能使用#include <memory>std::shared_ptr - yano


6

对于安装了功能包更新的VS2008,shared_ptr可以在std::tr1命名空间下找到。

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

如果您在IDE设置中添加了Boost安装路径(例如@ C:\Program Files\Boost\boost_1_40_0):

那么您可以使用以下语句导入boost库:

#include <boost/shared_ptr.hpp>

2
如果你正在寻找 boostshared_ptr,你可以通过 谷歌搜索 shared_ptr,跟随文档中的链接,并打开一个完整的工作示例,例如 this,轻松找到答案。
无论如何,我刚刚编写了一个简单的完整工作示例,供你参考:
#include <boost/shared_ptr.hpp>

struct MyGizmo
{
    int n_;
};

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

为了让#include找到头文件,库显然需要在搜索路径中。在MSVC中,您可以在“项目设置>配置属性>C/C++>附加包含目录”中设置这个路径。在我的情况下,它被设置为C:\Program Files (x86)\boost\boost_1_42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接