我怎样才能类型化定义一个命名空间限定类型?

问题描述 投票:0回答:1

我想做一些类似于 #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'"
c++ typedef
1个回答
3
投票

如何对一个命名空间限定类型进行类型化定义?

你为一个(在命名空间中的类型)定义了一个类型定义,就像这样。

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 是一个保留的命名空间。

© www.soinside.com 2019 - 2024. All rights reserved.