0

gf.h

typedef unsigned short gf_t;
class GaloisField{
public:
 gf_t * gf_exp;
 gf_t * gf_log;
 int gf_extension_degree, gf_cardinality, gf_multiplicative_order;
 static gf_t gf_ord();
 static int gf_inv(int x);

gf.cpp

 gf_t GaloisField::gf_ord(){
   return gf_multiplicative_order;
 }

 int GaloisField::gf_inv(int x){
   return gf_exp[GaloisField::gf_ord() - gf_log[x]]; //line 181
 }

我收到消息:gf.cpp:181: 错误:'gf_t' 和 'gf_t ()(gf_t)' 类型的无效操作数到二进制 'operator-'。为什么这个?

4

2 回答 2

5

由于gf_inv是静态函数,因此没有this指针。没有this,您将无法访问gf_log

我不知道为什么错误消息如此神秘。

于 2012-11-19T20:06:10.893 回答
0

您的代码中有几个问题:

  • 你定义gf_ordstatic,它不能,因为它返回一个实例字段。你可能的意思是const
  • 同样的gf_inv
  • gf_ord返回 a gf_t,但内部字段是 int,可能会出现舍入错误

这也许是一个更好的声明:

#include <exception>


class GaloisField{
protected:
    gf_t * gf_exp;
    gf_t * gf_log;
    int gf_extension_degree, gf_cardinality;
    gf_t gf_multiplicative_order;
public:
    GaloisField();
    gf_t gf_ord() const;
    int gf_inv(int x) throw(std::runtime_error);
    // ...
};

在 gf.cpp 中

GaloisField::GaloisField() {
    // here you should initialize your protected fields to default values
    // and create the gf_exp and gf_log arrays
}

gf_t GaloisField::gf_ord() const {
    return gf_multiplicative_order;
}

int GaloisField::gf_inv(int x) {
     int idx = gf_ord() - gf_log[x];
     if (idx >= 0)
       return gf_exp[idx];
     throw std::runtime_error("gf_inv");
}

如果你不在你的类中初始化数组,你会得到运行时错误,特别是在第 181 行。

也许您还需要另一个构造函数来为您的内部字段提供正确的值。

于 2012-11-19T20:13:27.207 回答