【问题标题】:How does one include TR1?一个如何包括TR1?
【发布时间】:2010-11-16 17:40:58
【问题描述】:

不同的编译器似乎对 TR1 有不同的想法。 G++ 似乎只接受包含以下类型:

#include <tr1/unordered_map>
#include <tr1/memory>
...

虽然微软的编译器只接受:

#include <unordered_map>
#include <memory>
...

据我了解TR1,微软的方式是正确的。

有没有办法让 G++ 接受第二个版本? 一般人如何以便携的方式处理 TR1?

【问题讨论】:

  • TR1 实际上并不是 C++ 标准的一部分,因此包含这些非标准头文件的“正确”方式必须是没有实际意义的。

标签: c++ include c++11 portability tr1


【解决方案1】:

在您的机器上安装 boost。
将以下目录添加到您的搜索路径。

/boost/tr1/tr1

查看这里boost tr1了解详情

现在,当您包含 时,您将获得具有 std::tr1::shared_ptr 的 tr1 版本的内存,然后它包含平台特定版本的 以获得所有正常的好东西。

【讨论】:

  • +1。由于 TR1 似乎是“让我们将这些 boost 类导入标准”
  • 我做#include "boost/tr1/unordered_map.hpp",如果它可用,它会使用 tr1 实现。
【解决方案2】:
#ifdef _WIN32
    #include <unordered_map>
    #include <memory>
#else
    #include <tr1/unordered_map>
    #include <trl/memory>
#endif

【讨论】:

  • 您可能应该将条件编译基于编译器,而不是平台(_WIN64 是真实的):例如#if defined( _MSC_VER ) &amp;&amp; ( _MSC_VER &gt; 1300 )
  • 在最后包含时,tr1 拼写错误为 trL ;)
  • 如果你在做 std::tr1::unordered_map ,你还需要同时包含 还是只包含 ?试图减少包含的库的数量。
【解决方案3】:

也许目前最好的方法是简单地使用 boost 库,因为在许多情况下,它们具有与 TR1 功能类似的接口的替代方案,只是位于不同(但一致)的标头路径和命名空间中。这样做的好处是可以在尚未开始实现 C++0x 的编译器上工作。还有很多有用的 boost 库根本不在 TR1 中:)

或者,在 G++ 上,您可以尝试在命令行上传递 --std=gnu++0x。这至少适用于 。然后让它在 std::tr1 中可用:

namespace std { namespace tr1 { using namespace std; } }

这自然是邪恶的。我强烈推荐使用 boost 方法:)

【讨论】:

  • 使用 -std=c++0x 或 -std=gnu++0x 不起作用,因为它只会使 std::unordered_set 可用,而不是 std::tr1::unordered_set .
  • @Grumbel,更新了一个邪恶的 hack,使其在 std::tr1 中可用
【解决方案4】:

也许有点老套,但您可以简单地将编译器 tr1 目录添加到您的包含路径。

【讨论】:

    【解决方案5】:

    如果在 Windows 下,将 'tr1' 目录添加到系统路径。那么#include &lt;memory&gt; 应该可以工作了。

    【讨论】:

    • Windows 上的编译器在解析包含时是否使用系统路径以及包含路径?
    【解决方案6】:

    我问过自己同样的问题。不幸的是,技术报告没有说明应该如何包含标题。它只定义扩展应该在 ::std::tr1 命名空间中。

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2017-09-29
      • 2017-11-12
      • 1970-01-01
      • 2019-03-09
      • 2013-08-22
      • 2012-05-11
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多