为什么gcc抱怨"错误:模板参数'0'的类型'intT'取决于模板参数"?

xml*_*lmx 3 c++ templates template-meta-programming variadic-templates c++11

我的编译器是gcc 4.9.0.以下代码无法编译:

template<typename T, T i>
struct value {};

template<typename T>
struct value<T, 0> {};
// error: type 'T' of template argument '0' depends on a template parameter
Run Code Online (Sandbox Code Playgroud)

原因是什么?而且,如何解决这个问题?

Rei*_*ica 8

GCC是对的,这是C++ 11 [temp.class.spec]§8明确禁止的:

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
    
    Run Code Online (Sandbox Code Playgroud)

    - 末端的例子 ]

  • 与专用非类型参数对应的模板参数的类型不应取决于特化的参数.[ 例如:

    template <class T, T t> struct C {};
    template <class T> struct C<T, 1>; // error
    template< int X, int (*array_ptr)[X] > class A {};
    int array[5];
    template< int X > class A<X,&array> { }; // error
    
    Run Code Online (Sandbox Code Playgroud)

    - 末端的例子 ]

  • ...

我相信第2点是最相关的.


关于"如何解决这个问题"的问题.现在问题的形式,我担心没有解决方法.

对于生成整数序列的原始版本,我相信您可以使用uintmax_t非类型模板参数的类型,并且只将其转换intT为最终定义.