不同的编译器似乎对 TR1 有不同的想法。G++ 似乎只接受包含以下类型:
#include <tr1/unordered_map>
#include <tr1/memory>
...
而微软的编译器只接受:
#include <unordered_map>
#include <memory>
...
至于我对TR1的理解,微软的方式是正确的。
有没有办法让 G++ 接受第二个版本?一般人如何以便携的方式处理 TR1?
不同的编译器似乎对 TR1 有不同的想法。G++ 似乎只接受包含以下类型:
#include <tr1/unordered_map>
#include <tr1/memory>
...
而微软的编译器只接受:
#include <unordered_map>
#include <memory>
...
至于我对TR1的理解,微软的方式是正确的。
有没有办法让 G++ 接受第二个版本?一般人如何以便携的方式处理 TR1?
在你的机器上安装 boost。
将以下目录添加到您的搜索路径。
<Boost 安装目录>/boost/tr1/tr1
有关详细信息,请参见此处提升 tr1
现在,当您包含 <memory> 时,您将获得具有 std::tr1::shared_ptr 的 tr1 版本的内存,然后它包含平台特定版本的 <memory> 以获得所有正常的好东西。
#ifdef _WIN32
#include <unordered_map>
#include <memory>
#else
#include <tr1/unordered_map>
#include <trl/memory>
#endif
也许最好的方法是现在简单地使用boost库,因为在许多情况下,它们具有与 TR1 功能相似的接口的替代方案,并且只是在不同(但一致)的头文件路径和命名空间中。这具有在甚至还没有开始实现 C++0x 的编译器上工作的优势。还有很多有用的 boost 库根本不在 TR1 中:)
或者,在 G++ 上,您可以尝试在命令行上传递 --std=gnu++0x。这至少适用于 <unordered_set> 和 <unordered_map>。然后使其在 std::tr1 中可用:
namespace std { namespace tr1 { using namespace std; } }
这自然是邪恶的。我强烈推荐使用 boost 方法:)
可能有点 hacky,但您可以简单地将编译器 tr1 目录添加到您的包含路径。
如果在 Windows 下,请将“tr1”目录添加到系统路径。然后#include <memory>
应该工作。
我问自己同样的问题。不幸的是,技术报告没有说明应该如何包含标题。它只定义扩展应该在 ::std::tr1 命名空间中。