我想做一些类似于 #define std::unordered_map my_namespace::my_map
. 我为什么要这么做,有各种复杂的原因(遗留代码、未来上游合并、性能等)。不幸的是。#define
不能与 ::
和 typedef
似乎也有问题。我可能会怎么做呢?
Typedef的问题。
typedef std::unordered_map my_namespace::my_map;
给出错误 "Typedef declarator cannot be qualified".namespace std { typedef unordered_map my_namespace::my_map };
给出错误 "不能在这里定义或重新声明'my_map',因为命名空间'std'没有包围命名空间'my_namespace'"如何对一个命名空间限定类型进行类型化定义?
你为一个(在命名空间中的类型)定义了一个类型定义,就像这样。
typedef some_ns::type alias;
你为一个类型定义一个(在命名空间中的类型),就像这样。
namespace other_ns {
typedef some_ns::type alias;
}
或者,你可以使用相应的 using
语法,我推荐使用。
namespace other_ns {
using alias = some_ns::type;
}
我想让std::unordered_map成为my_namespace::my_map的别名。
你不可以将typedefs添加到 std
命名空间。那是留给语言实现的。这在C++中是根本不可能的。
namespace std { typedef unordered_map my_namespace::my_map };
你把别名和目标类型的顺序搞错了。这使得 std::my_namespace::my_map
别名 std::unordered_map
. 如果你被允许将限定名放在 typedef 中,也会这样做,但你没有。考虑到你直觉上使用[alias, type]的顺序,所以你的 using
语法应该正好适合你。
无论如何,请看上一节关于 std
是一个保留的命名空间。