类型的操作数无效

时间:2012-11-19 20:00:55

标签: c++

让我们

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)'到二进制'运算符 - '的操作数无效。为什么这样?

2 个答案:

答案 0 :(得分:5)

由于gf_inv是一个静态函数,因此没有this指针。如果没有this,则无法访问gf_log

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

答案 1 :(得分:0)

您的代码中有几个问题:

  • 您将gf_ord定义为static,但它不能,因为它返回一个实例字段。你的意思可能是const
  • gf_inv
  • 相同
  • gf_ord返回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行。

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