如何引用TR1库?

29

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

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

虽然Microsoft的编译器只接受:

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

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

有没有办法让G++接受第二个版本?一般来说如何以可移植的方式处理TR1?


5
TR1实际上不是C++标准的一部分,因此包含这些非标准头文件的“正确”方式就无从谈起了。 - anon
6个回答

17

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

<Boost Install Directory>/boost/tr1/tr1

有关详细信息,请参见此处的boost tr1

现在,当您包含<memory>时,您将获得具有std::tr1::shared_ptr的tr1版本的memory,然后它会包含平台特定版本的<memory>以获取所有常规好处。


1
+1。由于TR1似乎是“让我们将这些Boost类导入标准库”的形式。 - KitsuneYMG
我使用 #include "boost/tr1/unordered_map.hpp",如果可用的话,它将使用 tr1 实现。 - Mohamed Bana

14
#ifdef _WIN32
    #include <unordered_map>
    #include <memory>
#else
    #include <tr1/unordered_map>
    #include <trl/memory>
#endif

你应该基于编译器而不是平台(_WIN64 是真实存在的)来进行条件编译,例如:#if defined( _MSC_VER ) && ( _MSC_VER > 1300 ) - IInspectable
在最后一个include中,tr1被拼错成了trL ;) - Vladyslav at AssuredLabs
如果你正在使用 std::tr1::unordered_map,你是否仍然需要同时包含 <tr1/unordered_map> 和 <tr1/memory>,还是只需要包含 <tr1/unordered_map> 就可以了?试图减少所包含的库的数量。 - Mona Wade

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方法代替 :)

使用-std=c++0x或-std=gnu++0x是不起作用的,因为它只会使std::unordered_set<>可用,但不会使std::tr1::unordered_set<>可用。 - Grumbel
@Grumbel,更新了一个邪恶的黑客技巧,使其在std::tr1中可用。 - bdonlan

3
也许有点不规范,但你可以简单地将编译器tr1目录添加到你的包含路径中。

2

我曾经有同样的疑问。不幸的是,技术报告没有说明如何包含头文件。它仅定义了扩展应位于::std::tr1命名空间中。


2
如果是在Windows下,需要将'tr1'目录添加到系统路径中。然后#include <memory>就可以使用了。

编译器在Windows上解析包含文件时,是否同时使用系统路径和包含路径? - jon hanson

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