模板结构错误

时间:2017-10-08 18:09:49

标签: c++ templates struct typedef

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

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;

2 个答案:

答案 0 :(得分:2)

当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 ++允许运算符重载,这样做可能非常诱人。但这是语义上的巨大变化。指数和按位xor没有像字符串连接和添加那样自然直观的映射。此外,^的优先级对于它在数学表达式中明智地替换取幂是完全错误的。

答案 1 :(得分:0)

#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;
}