【问题标题】:Where is shared_ptr?shared_ptr 在哪里?
【发布时间】:2011-02-24 11:33:58
【问题描述】:

在试图找到 shared_ptr 的位置几个小时后,我现在非常沮丧。我看到的所有示例都没有显示包含shared_ptr 标题的完整代码(并且正在工作)。简单地说明stdtr1<memory> 根本没有帮助!我已经下载了提升,但仍然没有出现!有人可以告诉我在哪里可以找到它吗?

感谢你让我发泄我的不满!

编辑: 我看到我的标题已更改。对于那个很抱歉。 所以...这也是因为我不清楚 shared_ptr 是否“依赖于 C++ 版本”-->这就是我没有说明我的环境的原因-->因此可能是我很难找到它的原因。

我正在研究 MSVS2008。

编辑 2: 我不知道为什么,但我在到处寻找shared_ptr 时包含了[memory] ​​和[boost/tr1/memory.hpp] 和[boost/tr1/tr1/memory]。当然,我不能。

感谢所有回复。

【问题讨论】:

  • 如果你能正确地说明你的设置,比如什么编译器和提升版本/安装路径,这可能会有所帮助
  • 除非您使用 C++0x,否则shared_ptr 不是标准的一部分。虽然它很常见,但有些人会将其视为标准,即使它尚未推出。
  • 在不知道您的环境是用于 7.5 位洗碗机芯片的 GCC、128 位大型机的专有编译器还是 XCode 的 GCC 版本的情况下,您认为我们应该如何回答这个问题?
  • 只是添加一些关于我遇到的问题的信息。如果你想用 c++0x 标准编译你需要添加“-std=c++0x”作为 g++ 的参数。
  • 如果你在 MSVC 上,那么你只需要“#include ”(对于 gcc,我有一个 CMake Find() 用于搜索,以便我可以声明预处理器定义以包含 与 作为首选是 tr1 而不是 boost - 请注意 boost 是 "hpp" 而 tr1 是 ".h" - 在 Gentoo/Fedora/Debian 上验证 - 当然要确保也有 #include 分别用于内存管理)

标签: c++ boost c++11 shared-ptr smart-pointers


【解决方案1】:

您至少可以在三个地方找到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>找到。

【讨论】:

  • 对于 VS 2008,您获得了“功能包”还是安装了 SP1?如果是这样,那么此处的第 2 部分适用于您,请使用命名空间 tr1
  • 谢谢。这就像魔术一样。我不知道为什么,但我在到处寻找 shared_ptr 的同时包含了 .. 当然,我做不到。再次感谢。
  • 暂时离开 C++ 后,我惊讶地发现(在 clang v3.1 中)shared_ptr 仍然位于 tr1 命名空间中。对此有什么想法吗?
  • @hiwaylon:你是用-std=c++11编译吗?
  • @JamesMcNellis Yessir,不幸的是,这对其他依赖项造成了一些不满,我无法继续(鉴于时间限制)。如果 -std=c++11 是诀窍,当我能够返回项目时,我可以有信心继续。谢谢。
【解决方案2】:
【解决方案3】:

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

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

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

#include <boost/shared_ptr.hpp>

【讨论】:

    【解决方案4】:

    如果您正在寻找 bor boostshared_ptr,您可以通过 googling 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 中,您可以在 Project Settings>Configuration Properties>C/C++>Additional Include Directories 中进行设置。就我而言,这设置为C:\Program Files (x86)\boost\boost_1_42

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2012-10-05
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多