Версия в двух словах: Почему я не могу определить специализацию шаблона (типа std-lib), которая полезна только в текущем модуле компиляции в анонимном пространстве имен внутри этого модуля модуля / cpp ?
Более длинная версия:
У меня есть тип, который является быстрым помощником только внутри одного cpp файла, назовем его struct Helper
. Поскольку он используется только в этом модуле компиляции, он объявлен и определен в анонимном пространстве имен внутри cpp.
Поскольку я хочу std::unordered_set<Helper>
, я должен специализироваться std::hash
. Когда я сейчас пытаюсь определить его в том же анонимном пространстве имен, я получаю C2888 'std::hash<'anonymous-namespace'::Helper>': symbol cannot be defined within namespace 'anonymous-namespace'
. Почему это так?
Я тоже пытался добавить using namespace std
и подобные вещи в AN, но безрезультатно.
/* 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 */
}
};
}
Конечно, я могу просто вывести специализацию за пределы АН, и это работает. Я просто хочу понять, почему оно не , пока оно внутри него
/* 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 */
}
};