【问题标题】:Issue with namespace scoping命名空间范围问题
【发布时间】:2020-01-17 08:41:03
【问题描述】:

为什么下面的代码会起作用(Utilities 是一个命名空间):

template<>
std::map<uint8_t, std::string> A::Utilities::EnumDescription<A::B::Tabs, uint8_t>::descMap =
{...};

而这个没有?

namespace A
{
namespace B
{

    template<>
    std::map<uint8_t, std::string> A::Utilities::EnumDescription<Tabs, uint8_t>::descMap =  // Error --> descMap
    {...};

}
}

错误 C2888:无法在命名空间“B”中定义符号
成员“A::Utilities::EnumDescription::descMap [with E=A::B::Tabs, T=uint8_t]”不能在当前范围内特化

【问题讨论】:

  • 发布的散文都没有编译为 C++(更不用说“工作”了)。
  • {...} 是伪代码。
  • @Pietro -- 这是无法编译的伪代码。不要发布想要尝试的人必须编辑的代码。

标签: c++ scope namespaces


【解决方案1】:

模板X 的全部和部分特化可以在定义X 的同一命名空间中定义,或者在包含(直接或间接)该命名空间的命名空间中定义,但不能在其他命名空间中定义(例如X 的命名空间的子命名空间或“表亲”命名空间)。这只是语言的规则。

在您的情况下,涉及的模板是 A::Utilities::EnumDescription,因此特化必须发生在 A::UtilitiesA 或全局命名空间内。

【讨论】:

  • 在这种情况下 namespace A { namespace B { Tabs } }A::B::Tabs 不应该是等价的吗?
  • 编译器是否在A::Utilities 中寻找Tabs
  • @Pietro 问题不在于Tabs,而在于EnumDescription。那是您要专门化的模板,它显然是在命名空间 AA::Utilities 中定义的(您的代码不会显示这是 NS 还是类),因此它必须相应地专门化。
  • 注意第一个 :: 是完全合格的东西所必需的。您可以在项目的每个命名空间中拥有 Utilities 子命名空间。
  • @Pietro 编译器可能会寻找它,但如果它没有找到它,它也会尝试::A::Utilities。您的代码的全部问题是您不能在 A::B 中专门化 A::something
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多