2011-01-06 51 views
0

當比方說,我有專業化使用多個typenames

template <typename T> 
class F; 

我可以創建另一個模板誰需要一個F作爲一種類型,具有默認和專業化未選中。

template <typename S> 
class G; 

template <> 
template <typename T> 
class G <F<T> > 
{ 
}; 

我可以實例化G<F<int> > g_of_f。編譯器正確選擇G的專業化,並且一切都很好。

所以這是我的問題。我想在列表中使用多個模板類型名稱來執行此操作。但是,當我嘗試

template <typename U, typename S> 
class H; 

template <typename U> 
template <typename T> 
class H <U, F<T> > 
{ 
}; 

現在我不能實例H<void, F<int> > h_of_f,因爲編譯器選擇原始模板H,而不是專業化。

我用g ++ 4.1和g ++ 4.4觀察到了相同的行爲。

GH之間的區別是什麼,阻止編譯器按我期望的方式工作?

回答

3

template<>語法用於引入明確專業化的聲明,你這裏有部分專長:

template <typename S> 
class G; 

template <typename S> 
class G < F<S> > 
{ 
}; 

template <typename U, typename S> 
class H; 

template <typename U, typename S> 
class H <U, F<S> > 
{ 
};