模板元编程,简历资格错误中的冲突

Template metaprogramming, conflicts in cv-qualification error

本文关键字:错误 冲突 编程      更新时间:2023-10-16

我正在尝试使用模板元编程实现一个正弦函数。但是,由于简历资格的冲突,我收到错误"radtest"不是双重的有效模板参数。这是代码:

#include <iostream>
using namespace std;
template <double&, int, int> struct 
Series;
template <double& rad> struct Sine
{
enum
{
maxterms=10 
};      
static inline double sin()
{
return (rad) * 
Series<(rad), 0, maxterms>::val(); 
}
};
template <double& rad, int i, int 
maxterms> struct Series
{
enum 
{
cont = i+1 != maxterms, 
nxt1 = (i+1)*cont,
nxtmax = maxterms*cont      
};
// uses recursive definition of 
// Sine
// sin(x)=x*term(0)
// term(n)=1-
// x*x/(2*n+2)/(2*n+3)*term(n+1)
static inline double val()
{
return 1 - (rad)*
(rad)/(2.0*i+2.0)/(2.0*i+3.0)
* Series<rad * cont, nxt1, 
nxtmax>::val(); 
}
};
#define SineT(rad) Sine<rad>::sin()
constexpr double radtest=0.707;
int main() 
{
cout << "Sine of " << radtest 
<< " is: " << SineT(radtest);
return 0;
}

可能是什么问题?提前谢谢。

问题是radtestconst的(由constexpr暗示),所以你不能让sinedouble&参数绑定到它。

如果您尝试使其double radtest(不是constexpr),或者如果您尝试将所有模板参数const double&则会遇到另一个问题:无法将临时绑定到引用非类型模板参数。这是标准明确不允许的:

§ 14.3.2 模板非类型参数

非类型模板参数的模板参数应为转换后的常量表达式 (5.20) 的类型为 模板参数。对于引用的非类型模板参数或指针类型,常量表达式的值不得引用 to(或对于指针类型,不应是以下地址):

  • (1.2) 临时对象 (12.2),

我个人看不到摆脱这种混乱的方法。这(使用引用作为模板非类型参数)实际上突破了C++模板系统可以执行的操作的界限。

我能推荐的是创建一个constexpr罪函数。

相关文章: