繁体   English   中英

模板结构错误

[英]Template Struct Error

我正在尝试创建一个保留其系数以及多项式函数的多项式结构。 但是我得到了错误:

 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: .... };完全相同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: %s\n", 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 identifier\n");
        return -1;
    }

    summary(prec);

    float tt = 2.01;
    float qq = Horners(tt);
    printf("Answer is %f\n", qq);

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM