我有C ++代码03看起来像这样:
#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...
我开始怀疑,我会以后,如果遭受/当我将代码转换为C ++ 11,这(我猜)不具有std::tr1::unordered_map
但std::unordered_map
来代替。 所以,我想出了下面的技巧:
namespace std
{
using namespace ::std::tr1;
}
...
std::unordered_map<std::string, int> mystuff; // no tr1 now!
...
难道是合法的(也许进口的东西到std
是被禁止的)? 这将使它更容易端口C ++代码11 /互操作?
你不应该碰std
命名空间:即使现在的工作,以后可以引起严重的头痛(与编译器的新版本,在不同的编译器等)。
更新:报价从标准(C ++ 2003,第17.4.3.1 “保留名称”)(发现这里 ):
它是未定义 C ++程序添加声明或定义除非另有规定空间std 内空间std或命名空间。 程序可以为任何标准库模板,空间std添加模板特。 这种专业化的未定义的行为一个标准库模板的结果(完全或部分),除非声明取决于外部连杆的用户定义的类型和除非专业化符合原始模板的标准库的要求。 [重点煤矿]
导入塞给::std
是由C ++ 11 17.6.4.2.1禁止:
如果其添加声明或定义到命名空间一个C ++程序的行为是未定义std
命名空间内或一个命名空间std
除非另有规定。
我觉得这个问题是非常相似的,你问什么。
我特别喜欢它说“使用autoconf检测符号可用性,然后使用条件定义了一个给定的名称别名正确命名空间”的答案。
如果你有,你不能支持特定的库更明确的方式证明这种便携性,因此只会尝试,最好你应该围绕它#ifdef
的具体到特定的环境。
点tr1
是您的隔离std
从东西tr1
。