在我的节目中,我使用的是自酿的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());
}
};
Cos
和Sin
以类似方式进行模板化,并使用递归来获取其值。他们运作良好。但是,当我尝试编译代码时,FFT
部分会产生错误。错误的确切措辞是:
'N'不能出现在常量表达式中 'k'不能出现在常量表达式中 模板参数1无效
模板参数2无效
任何帮助都将不胜感激。
答案 0 :(得分:0)
根据C ++标准(第14.3.2节模板非类型参数)
1非类型非模板模板参数的模板参数 应为以下之一: - 对于积分或的非类型模板参数 枚举类型,转换后的常量表达式(5.19) template-parameter的类型;