【发布时间】:2020-03-18 08:33:31
【问题描述】:
Nutshell 版本: 为什么我不能在编译单元/cpp 文件内的匿名命名空间中定义仅在当前编译单元中有用的模板特化(std-lib 类型)?
加长版:
我有一个类型,它只是一个 cpp 文件中的快速助手,我们称之为struct Helper。因为它只在那个编译单元中使用,所以它是在 cpp 内的匿名命名空间中声明和定义的。
因为我想要std::unordered_set<Helper>,所以我必须专攻std::hash。当我现在尝试在同一个匿名命名空间中定义它时,我得到一个C2888 'std::hash<'anonymous-namespace'::Helper>': symbol cannot be defined within namespace 'anonymous-namespace'。这是为什么呢?
我也尝试在 AN 中添加 using namespace std 和类似的东西,但无济于事。
/* This doesn't work */
namespace
{
struct Helper
{
int member1;
bool member2;
};
using namespace std;
template<>
struct std::hash<Helper>
{
size_t operator()(const Helper& helper) const
{
return 12345; /* how it's really generated is irrelevant here */
}
};
}
当然,我可以将专业化放在 AN 之外,这样就可以了。我只是想了解为什么它在里面时不!
/* This works, but why doesn't the other? */
namespace
{
struct Helper
{
int member1;
bool member2;
};
}
template<>
struct std::hash<Helper>
{
size_t operator()(const Helper& helper) const
{
return 12345; /* how it's really generated is irrelevant here */
}
};
【问题讨论】:
标签: c++ templates namespaces template-specialization