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

时间:2014-07-09 14:18:49

标签: c++ templates c++11 variadic-templates template-meta-programming

我的编译器是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

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

2 个答案:

答案 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时,这对我来说效果很好。