这是非常迂腐的,但在 C++03 中,程序在命名空间中重载(而不是专门化)模板函数显然是不符合规范的std
:请参阅此处提及的内容和关于 comp.lang.c++.moderated 的长时间讨论
即这没关系:
namespace std
{
template <>
void swap (Foo & f, Foo & g)
{
// ...
}
}
但这不是(如果我理解正确的话......):
namespace std
{
template <typename T>
void swap (TempateFoo<T> & f, TempateFoo<T> & g)
{
// ...
}
}
这在 C++11 中仍然成立吗?此外,这是否也适用于模板类(如std::hash
),还是仅适用于模板函数?
编辑:另外,有没有标准库实现的例子,这样后者会在实践中破坏东西?如果没有,是否有特定原因不允许像上面第二种情况那样重载?(理论上可能会破坏什么?)