請,看看有什麼我試圖做的事:爲什麼不允許模板專門化在不同的命名空間中?
#include <iostream>
namespace first
{
template <class T>
class myclass
{
T t;
public:
void who_are_you() const
{ std::cout << "first::myclass"; }
};
}
namespace second
{
using first::myclass;
template <>
class myclass <int>
{
int i, j;
public:
void who_are_you() const
{ std::cout << "second::myclass"; }
};
}
這是不允許的。您能否請,澄清爲什麼不能專門化在不同的命名空間,什麼是可用的解決方案?另外,是否在C++ 0x中修正了一些問題?
這將讓我舉例來說,專門std::max
,std::swap
,std::numeric_limits
等。不加東西::std::
訴諸未定義行爲?
@AndreyT下面是我,雖然我會使用它:
// my_integer is a class
std::numeric_limits<my_integer>::max(); // specialized std::numeric_limits for my_integer
可以這樣做?
作爲替代方案,您是否可以創建一個從標準繼承的新模板? – Cogwheel 2010-06-18 18:47:22
根據§17.4.3.1/ 1:「程序可以將任何 標準庫模板的模板特化添加到名稱空間標準。標準庫模板的這種專業化(完整或部分)會導致未定義的行爲,除非該聲明依賴於用戶 - 外部鏈接的定義名稱,除非專業化符合原始模板的標準庫要求。「所以,雖然有限制,你可以*在適當的情況下將這樣的特化添加到':: std ::'。 – 2010-06-18 18:52:52
@jerry棺材我認爲添加任何東西都會導致未定義的行爲!請提供答案解釋如何滿足這些要求? – AraK 2010-06-18 19:00:12