我的编译器是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
原因是什么?而且,如何解决这个问题?
答案 0 :(得分: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
- 示例]
对应于专用非类型参数的模板参数的类型不应该是 取决于专业化的参数。 [示例:
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
。
答案 1 :(得分:0)
直接使用std :: integral_constant代替整数常量:
template<typename T, typename VALUE>
struct value;
template<typename T>
struct value<T, std::integral_constant<T, 0> >
{
};
当我尝试为C ++ 11实现std :: make_integer_sequence时,这对我来说效果很好。