2
template < int ...Indices> 

class T1 { 
    template <int _1, int _2> 
    class T2; 
}; 

template <int ...Indices> 
template <int _1> 
class T1<Indices...>::T2<_1, sizeof...(Indices)> {}; 
//^--error: non-type template argument depends on a template parameter of the partial specialization 

在gcc 4.5+上編譯但在clang 3.1和icc上都沒有編譯,都抱怨sizeof...(Indices)的使用。 它只是一個尚未實現的功能在後面的編譯器或一些特殊情況?取決於封閉模板參數的嵌套模板專門化

感謝,

Buote

+4

看起來像這些編譯器中的錯誤。如果可以的話,嘗試在'T1'' class {}'塊內定義嵌套模板,如果需要的話,可能委託給一個單獨的成員模板。 – Potatoswatter 2012-01-15 12:20:49

回答

0

你可以嘗試嘗試:

template < int ...Indices> 
class T1 
{ 
    static const int index_size = sizeof...(Indices); 

    template <int _1, int _2> 
    class T2; 
}; 

template <int ...Indices> 
template <int _1> 
class T1<Indices...>::T2<_1, T1<Indices...>::index_size> {}; 

,看看如果編譯器的問題是與實際sizeof...運營商,或者如果它的搭配方式它被使用在模板聲明中。

+0

這也行不通,所以我猜他們現在都缺乏這個功能 - 作爲一種解決方法,我只是逆轉了我的初始遞歸順序,以便可以爲一個常量值(例如1)完成部分專業化。 – 2012-01-17 20:36:16

+0

作爲一個旁註,intel編譯器有時會出現一些奇怪的問題,因爲嵌套類的專業化 - 在外部類'{};'內部而不是外部使用相應的聲明。 – 2012-01-17 20:45:56

1

標準說,在[temp.class.spec]段落8的是

在類模板部分特例的參數列表,有以下限制:
- 一種部分專門的非類型參數除非參數表達式是簡單標識符,否則表達式不應包含部分特化的模板參數。 [示例:

 
    template <int I, int J> struct A {}; 
    template <int I> struct A<I+5, I*2> {}; // error
template <int I, int J> struct B {}; template <int I> struct B<I, I> {}; // OK
- 端示例]

規則的目的是基於非平凡表達式像那些在例如以禁止偏特,和sizeof...(Indices)一個簡單的標識符,以便也許鏗鏘和國際刑事法院是正確的拒絕它。說實話,我不確定哪個編譯器是正確的。我建議向其中一個編譯器報告錯誤,如果他們說他們的實現是正確的,則將其報告給其他人以解釋它的不同之處!