10

我想使用现代版本的 GCC 和 MSVC 附带的 TR1 库,但存在细微差别:在 GCC 中,我不得不说

#include <tr1/memory>
std::tr1::shared_ptr<int> X;

在 MSVC 中我不得不说

#include <memory>
std::shared_ptr<int> X;

我有两个问题:1)MSVC 是自动在 C++0x 模式下运行(相当于 GCC 的 std=c++0x),还是默认在 C++98/03 模式下运行?2)如何统一包含和命名空间?我正在考虑“INCLUDE_TR1(内存)”之类的预处理器宏或类似的东西。

澄清一下,我想使用传统的标准 C++98/03;不是C++0x(否则不会有问题)。

我将不胜感激任何建议!

4

4 回答 4

4
  1. VC++ 2010只能在 C++0x 模式下运行;以前的版本不支持 C++0x。也就是说,VC++ 2010 中的大部分标准库仍然基于 TR1(例如std::result_of<>使用 TR1 result_of 协议而不是decltype基于 -);事实上,VC++ 2010 中的许多标准库实际上并没有在 namespace 中定义std,而是在 namespace 中并使用 using 指令std::tr1拉入 namespace 。std
  2. 使用升压TR1 - 它将#include根据您的平台提供适当的标头,或者如果您的平台不支持 TR1,#include则相应的 Boost 实现并std::tr1使用 using 声明将它们拉入命名空间。
于 2011-05-10T15:39:16.530 回答
4

VC++ 2010始终在 C++0x 模式下运行,但类同时存在于std std::tr1命名空间中。您必须使用 a 来检测编译器#if _MSC_VER以选择要包含的标头(请参阅此答案)。

Boost.TR1库可以自动包含编译器的头文件并使用 Boost 填充任何缺失的功能。它可能会有所帮助。

于 2011-05-10T15:41:23.217 回答
2

好的,在 Boost.TR1 遇到了几个不一致且无法解决的问题之后,尤其是在尝试使用 GCC 的原生 TR1 库时,我决定完全放弃 Boost 并使用一个小的#define 解决方法。这是我的“tr1.h”:

#ifndef _TR1_INCLUDE_H
#define _TR1_INCLUDE_H

/** Usage: #include TR1INCLUDE(unordered_map)
 **
 ** Configuration: Define HAVE_TR1_SUBDIR if you need #include <tr1/unordered_map>; otherwise we take #include <unordered_map>.
 **
 **/

#define QUOTE(arg) <arg>

#ifdef HAVE_TR1_SUBDIR
#  define TR1IFY(arg) tr1/arg
#else
#  define TR1IFY(arg) arg
#endif

#define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))

#endif

现在我可以像这样编写我的程序:

#include "tr1.h"
#include TR1INCLUDE(unordered_map)
于 2011-05-10T21:17:17.240 回答
1

不同版本的 MSVC 具有它们所具有的功能。没有办法打开或关闭它们。

其中一些可能还具有某些功能的 tr1 和 std 版本。语义略有不同!

于 2011-05-10T15:39:53.673 回答