29

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

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

而微软的编译器只接受:

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

至于我对TR1的理解,微软的方式是正确的。

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

4

6 回答 6

17

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

<Boost 安装目录>/boost/tr1/tr1

有关详细信息,请参见此处提升 tr1

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

于 2009-08-04T17:35:36.020 回答
14
#ifdef _WIN32
    #include <unordered_map>
    #include <memory>
#else
    #include <tr1/unordered_map>
    #include <trl/memory>
#endif
于 2010-07-15T20:20:12.720 回答
4

也许最好的方法是现在简单地使用boost库,因为在许多情况下,它们具有与 TR1 功能相似的接口的替代方案,并且只是在不同(但一致)的头文件路径和命名空间中。这具有在甚至还没有开始实现 C++0x 的编译器上工作的优势。还有很多有用的 boost 库根本不在 TR1 中:)

或者,在 G++ 上,您可以尝试在命令行上传递 --std=gnu++0x。这至少适用于 <unordered_set> 和 <unordered_map>。然后使其在 std::tr1 中可用:

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

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

于 2009-08-04T16:08:17.587 回答
3

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

于 2009-08-04T16:08:32.360 回答
2

如果在 Windows 下,请将“tr1”目录添加到系统路径。然后#include <memory>应该工作。

于 2009-08-04T16:09:02.903 回答
2

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

于 2009-09-21T18:44:16.150 回答