【发布时间】:2013-02-27 05:21:56
【问题描述】:
这是非常迂腐的,但在 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),还是仅适用于模板函数?
编辑:另外,有没有标准库实现的例子,这样后者会在实践中破坏东西?如果没有,是否有特定原因不允许像上面第二种情况那样重载? (理论上可能会出现什么问题?)
【问题讨论】:
-
我认为你不能为模板专业化以外的东西打开
std命名空间。 -
那么第二个例子还是非法的?
-
是的,但我不是 100% 确定。
-
好的...我标记了这个语言律师是有原因的 :)
-
请记住问题的答案“是否有任何标准库实现的示例,这样后者会在实践中破坏事物?” 可能是 NONE,但事实并非如此' t 意味着它将来不会中断(如果标准不允许 such 添加到
std命名空间)。
标签: c++ c++11 std language-lawyer