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)
原因是什么?而且,如何解决这个问题?
GCC是对的,这是C++ 11 [temp.class.spec]§8明确禁止的:
8在类模板部分特化的参数列表中,以下限制适用:
除非参数表达式是简单标识符,否则部分专用的非类型参数表达式不应涉及部分特化的模板参数.[ 例如:
Run Code Online (Sandbox Code Playgroud)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- 末端的例子 ]
...
我相信第2点是最相关的.
关于"如何解决这个问题"的问题.现在问题的形式,我担心没有解决方法.
对于生成整数序列的原始版本,我相信您可以使用uintmax_t非类型模板参数的类型,并且只将其转换intT为最终定义.