0

行列-ベクトル乗算の演算子*をオーバーロードしたいと思います。これが私のVectorクラスとMatrixクラスです。

class Vec2
{
  public:
    Vec2(){}
    Vec2(const RealNumber& a, const RealNumber& b)
    {
      a_ = a; b_ = b;
    }

    Vec2& operator =  (const Vec2& B)
    {
      a_ = B.a_;
      b_ = B.b_;
      return(*this);
    }

    void a(const RealNumber& a){
      a_ = a;
    }

    void b(const RealNumber& b){
      b_ = b;
    }

    const RealNumber a(void){
      return(a_);
    }

    const RealNumber b(void){
      return(b_);
    }

  private:
    RealNumber a_,b_;
};

および行列クラス:

class Mat2x2
{
  public:
    Mat2x2(){}
    Mat2x2(const RealNumber& a,
           const RealNumber& b,
           const RealNumber& c,
           const RealNumber& d)
    {
      a_ = a; b_ = b; c_ = c; d_ = d;
    }

    Mat2x2& operator =  (const Mat2x2& B)
    {
      a_ = B.a_;
      b_ = B.b_;
      c_ = B.c_;
      d_ = B.d_;
      return(*this);
    }

    const RealNumber a(void){
      return(a_);
    }

    const RealNumber b(void){
      return(b_);
    }

    const RealNumber c(void){
      return(c_);
    }

    const RealNumber d(void){
      return(d_);
    }
    // compile time problem with this overloading function
    const Vec2 operator * (const Vec2& B) const {
      Vec2 result;
      result.a(this->a_*B.a()+this->b_*B.b());
      result.b(this->c_*B.a()+this->d_*B.b());
      return result;
    }    

  private:
    RealNumber a_,b_,c_,d_;
};

でコードをコンパイルするg++と、次のエラーが発生します。

error: passing ‘const rln::Vec2’ as ‘this’ argument of ‘const rln::RealNumber rln::Vec2::a()’ discards qualifiers [-fpermissive]

問題の解決方法がわかりません。

4

1 に答える 1

3

const次のように、アクセサ関数を作成します。

RealNumber a() const { return a_; }
//             ^^^^^

(ちなみに、戻り値を にする必要はありませんconst。実際、これは C++11 では非推奨のパターンです。単純にしておいてください。)

于 2012-11-01T23:44:57.270 に答える