模板结构错误

Template Struct Error

本文关键字:错误 结构      更新时间:2023-10-16

我正在尝试创建一个多项式结构,该结构保存其系数以及它的单项函数。然而,我得到了错误:

main.cpp:10:1: error: template declaration of ‘typedef’  
typedef struct polynomial_t 

我的代码:

template <typename precision>
typedef struct polynomial_t
{
precision coefficients[] = {1};
precision exact(precision xx) {
return (xx - 2) ^ 9;
}; 
} poly;

当C++添加class关键字时,它也发生了变化,以structclass关键字命名的实体与其他类型标识符的处理方式相同,并且您不再需要使用这些关键字来限定对它们的引用。部分原因是structclass之间几乎没有区别,强迫人们记住他们使用的是哪一个,或者允许人们交替使用它们会非常令人困惑。

唯一的区别是在结构中声明的事物的默认访问级别。class foo { .... };struct foo { private: .... };完全相同。

因此,您的typedef是不必要的,事实上,在C++中不再合法。

为了获得同样的效果,你可能应该这样做:

template <typename precision>
struct poly
{
precision coefficients[] = {1};
precision exact(precision xx) {
return (xx - 2) ^ 9;
}; 
};

如果真的希望以后能够使用polynomial_t,可以在声明之后添加typedef poly polynomial_t;。但我不推荐。

您的代码作为其他有趣的问题。我真的不确定这些声明的目的,但它们目前看起来不像是C++中可行多项式表示的开始。但是,这只是基于有限信息的猜测。

特别让我担心的是,您似乎试图使用^来表示幂运算。C++允许运算符重载,因此这样做可能非常诱人。但这是语义上的巨大变化。指数运算和逐位异或运算不像字符串串联和加法那样具有自然的直观映射。此外,^在数学表达式中合理地代替幂运算的优先级是错误的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
using namespace std;
// ONLY MESS WITH THIS STRUCT
template <typename precision>
struct polynomial
{
int degree = 9;
precision coefficients[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
precision exact(precision xx) {
return pow(xx-2 , 9);
}; 
} poly;
void summary(const char* prec) {
printf("=========================n");
printf("nPrecision: %sn", prec);
printf("=========================n");
}
template <typename precision>
precision Horners(const precision xx) {
precision qq = poly<precision>.coefficients[poly<precision>.degree];
for(int i = poly<precision>.degree-1; i >= 0; i--) {
qq = xx * qq + poly<precision>.coefficients[i];
}
return qq;
}
template <typename precision>
precision ForwardError(const precision xx) {
precision pTilde;
for(int i = 0; i <= poly<precision>.degree; i++) {
pTilde += abs(poly<precision>.coefficients[i]) * (abs(xx) ^ i);
}
precision machineEps = numeric_limits<precision>::epsilon();
precision bound = pTilde * (2 * poly<precision>.degree * machineEps) / 
(1 - 2 * poly<precision>.degree * machineEps);
return bound;
}
/*
Parameter 1: Singl/Double precision
Parameter 2: 
*/
int main(int argc, char *argv[]) {
char prec[6];
if((strcmp(argv[1], "s") == 0) || (strcmp(argv[1], "S") == 0))
strcpy(prec, "Single");
else if((strcmp(argv[1], "d") == 0) || (strcmp(argv[1], "D") == 0))
strcpy(prec, "Double");
else {
printf("Invalid precision identifiern");
return -1;
}
summary(prec);
float tt = 2.01;
float qq = Horners(tt);
printf("Answer is %fn", qq);
return 0;
}