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

Template argument invalid; cannot appear in constant expression

本文关键字:常量 表达式 不能 参数 无效      更新时间:2023-10-16

在我的程序中,我使用的是自制的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无效

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

1非类型、非模板模板形参的模板实参应为:-对于非类型模板,参数为整型或枚举类型的转换后的常量表达式 (5.19)模板类型-参数;