我的编译器是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
原因是什么?以及,如何解决这个问题?
GCC 是对的,这是 C++11 [temp.class.spec] §8 明确禁止的:
8 在类模板部分特化的参数列表中,应用以下限制:
-
部分专门化的非类型参数表达式不应涉及模板参数
部分特化,除非参数表达式是简单的标识符。 [ Example:
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
—结束示例 ]
-
与专用非类型参数对应的模板参数的类型不应是
取决于专业化的参数。 [Example:
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 点是这里最相关的一点。
关于“如何解决这个问题”的问题。从目前问题的形式来看,恐怕没有解决方法。
至于制作整数序列的原始版本,我believe你可以让它工作使用uintmax_t
对于非类型模板参数的类型,只将其转换为intT
在最终的定义中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)