模板参数无效;不能出现在常量表达式中
Template argument invalid; cannot appear in constant expression
在我的程序中,我使用的是自制的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无效
根据c++标准(第14.3.2节模板非类型参数)
1非类型、非模板模板形参的模板实参应为:-对于非类型模板,参数为整型或枚举类型的转换后的常量表达式 (5.19)模板类型-参数;
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"