2012-08-28 42 views
4

給定模板別名可以將模板別名用於部分專業化嗎?

template<unsigned U> 
using uint_ = integral_constant<unsigned,U>; 

的同時用gcc不產生警告

template<class T,class P> 
struct size{}; 

作爲

template <class T,unsigned U> 
struct size<T,uint_<U>>{}; 

生成警告作爲template parameter can not be deduced爲鐺3.1部分特4.7

那麼,它是否發生故障形式化代碼?

+3

我看不出沒有理由不應該這樣。別名模板立即被替換。 –

+0

不僅它在叮噹聲3.1中給出警告,而且如果我嘗試實例化它,它會忽略專業化。但是,直接使用integral_constant替代別名的方式與往常一樣。我想這是叮噹蟲。 – abir

+0

@abir:這意味着模板別名在Clang中沒有正確實現。 – Nawaz

回答

5

C++ 11中的代碼非常好。 Clang的警告可以忽略。

3

另一個人說這是一個叮噹蟲。你可以圍繞工作,如果你改變了使用的聲明這樣

template<unsigned T, unsigned U = T> 
using uint_ = integral_constant<unsigned,U>; 

作爲一個受過教育的猜測,顯然鏘不正確更新出現在類型ID模板參數的身份。因此,在你的例子中,認爲生成的uint_<U>類型引用了部分特化的第一個參數(因爲在uint_中是這種情況,但不在使用中)。或者,您可以在使用地點交換訂單

template <unsigned U,class T> 
struct size<T,uint_<U>>{};