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_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行目でランタイムエラーが発生します。

おそらく、内部フィールドに適切な値を与えるために、別のコンストラクターも必要になります。

于 2012-11-19T20:13:27.207 に答える