这是非常迂腐的,但在 C++03 中,程序重载(而不是专门化)显然是不符合中的模板函数的std
命名空间:参见此 here 的提及和 long discussion on 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
),还是仅适用于模板函数?
编辑:还有,是否有任何标准库实现的例子,使得后者在实践中会破坏事物?如果不是,是否有像上面第二种情况那样不允许重载的特定原因? (理论上可能会破坏什么?)
最佳答案
不可能在 C++ 中定义函数模板的部分特化,因此您的第二个示例定义了重载不是特化。由于标准只允许将特化添加到命名空间 std
,因此您的重载是非法的。
Is this still true in C++11?
是的。
Also, does this apply to template classes (like std::hash) too, or just template functions?
无论如何你都不能重载类模板,你只能重载函数。但是,同样的规则适用,如果特化依赖于用户定义的(即非标准的)类型,则只能特化类模板。
is there a specific reason for disallowing overloads like in the second case above? (what could potentially break in theory?)
举个例子,实现可能想要获取一个函数的地址,但是如果你重载了这个函数,那么获取地址可能会导致歧义并无法编译,这意味着你刚刚破坏了标准中的有效代码图书馆。
关于c++ - 在 std 命名空间中重载(非特化)模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104760/