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)一个简单的标识符,以便也许铿锵和国际刑事法院是正确的拒绝它。说实话,我不确定哪个编译器是正确的。我建议向其中一个编译器报告错误,如果他们说他们的实现是正确的,则将其报告给其他人以解释它的不同之处!