模板参数无效;不能出现在常量表达中

时间:2014-05-21 20:35:37

标签: c++ templates

在我的节目中,我使用的是自酿的FFT。为了提高性能,我试图使用模板在编译时计算复杂因子。产生错误的代码部分是

typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;

void fft(CArray& x){
    const size_t N = x.size();
    if(N==1){return;}

    CArray even = x[std::slice(0,N/2,2)];
    CArray odd = x[std::slice(1,N/2,2)];

    fft(even);
    fft(odd);

    for(size_t k=0; k<N/2; k++){
        Complex t = Twiddle<N,k>::value() * odd[k];
        x[k] = even[k] + t;
        x[k+N/2] = even[k] - t;
    }
}

其中Twiddle< N,k>

template <size_t N, size_t k, typename T=std::complex<double> >
struct Twiddle;

template <size_t N, size_t k>
struct Twiddle<N,k,std::complex<double> >{
    static std::complex<double> value(){
        return std::complex<double>(Cos<N,k>::value(),Sin<N,k>::value());
    }
};

CosSin以类似方式进行模板化,并使用递归来获取其值。他们运作良好。但是,当我尝试编译代码时,FFT部分会产生错误。错误的确切措辞是:

  

'N'不能出现在常量表达式中      'k'不能出现在常量表达式中      模板参数1无效
     模板参数2无效

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据C ++标准(第14.3.2节模板非类型参数)

  

1非类型非模板模板参数的模板参数   应为以下之一: - 对于积分或的非类型模板参数   枚举类型,转换后的常量表达式(5.19)   template-parameter的类型;