【问题标题】:Nested template specialization depending on enclosing template parameters嵌套模板特化取决于封闭模板参数
【发布时间】:2012-02-10 14:51:41
【问题描述】:
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) 的使用。 它只是后者编译器中尚未实现的功能还是某些特殊情况?

谢谢,

布特

【问题讨论】:

  • 看起来像那些编译器中的错误。如果可以,请尝试在 T1class {} 块内定义嵌套模板,如有必要,可能会委托给单独的成员模板。

标签: c++ c++11 template-specialization nested-class variadic-templates


【解决方案1】:

标准在 [temp.class.spec] 第 8 段中说

在类模板部分特化的参数列表中,适用以下限制:
— 部分特化的非类型实参表达式不应涉及部分特化的模板形参,除非实参表达式是简单标识符。 [ 例子:

模板 结构 A {}; 模板 结构 A {}; // 错误
模板 结构 B {}; 模板 结构 B {}; // 好的 ——结束示例]

该规则的目的是禁止基于示例中的非平凡表达式的部分特化,而sizeof...(Indices) 不是一个简单的标识符,因此可能 clang 和 ICC 拒绝它。老实说,我不确定哪个编译器是正确的。我建议向其中一个编译器报告错误,如果他们说他们的实现是正确的,请向其他编译器报告错误,以便对其进行不同的解释!

【讨论】:

    【解决方案2】:

    你可以试试:

    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... 运算符有关,或者是否与它在模板声明中的使用方式有关。

    【讨论】:

    • 这也不起作用,所以我猜他们目前都缺少该功能 - 作为一种解决方法,我只是颠倒了我的初始递归顺序,以便可以对常数进行部分特化值(例如 1)。
    • 附带说明一下,intel 编译器有时会在嵌套类的特化方面遇到一些奇怪的问题——在外部类的 {}; 块内部而不是外部进行相应的声明。
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2015-02-19
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多