這是非常迂腐但在C++ 03這顯然是不符合的程序超載(不專門)在std
命名空間的模板函數:見這here和long discussion on comp.lang.c++.moderated重載(不專業)在std名字空間模板
即提到這是確定的:
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'命名空間。 – Nawaz 2013-02-27 05:26:27
那麼第二個例子仍然是非法的? – 2013-02-27 05:27:32
是的,但我**不是** 100%確定。 – Nawaz 2013-02-27 05:28:03