我正在阅读"游戏编程宝石"书。我目前正在实施正弦示例:
//Sine class
template<double &x, unsigned N>
struct Sine
{
static constexpr double val = x * (1.0 - x * x / (2.0 * N + 2) / (2.0 * N + 3)) * Sine<x,N+1>::val;;
};
//
template<const double &x>
struct Sine<x, 10>
{
static constexpr double val = 1.0;
};
我试图用:
调用我的模板值constexpr double x = 1.234;
cout << "Sine<1.234,0>::val = " << Sine<x, 0>::val << endl;
导致错误:
错误:&#39; x&#39;不是类型&#39; double&amp;&#39;的有效模板参数。因为 cv-qualification中的冲突|
我不知道我做错了什么? 在此先感谢您的帮助!
答案 0 :(得分:3)
浮点类型不能是非类型模板参数。因此,模板的作者改为引用了double
。
您的代码有两个问题。首先,这种引用的参数必须具有静态存储持续时间和链接,您的变量不能同时具有块范围中定义的两者。其次,您的变量为const
(因为它是constexpr
),并且非const
引用无法绑定到const
对象。
将模板参数更改为double const&
,并传递类型为constexpr
的名称空间范围double
作为模板参数。