Я бы хотел перегрузить оператор * для умножения матрицы на вектор. Вот мои классы 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]
Я не могу понять, как решить проблему.
Сделайте ваши функции доступа const
, вот так:
RealNumber a() const { return a_; }
// ^^^^^
(Между прочим, нет необходимости делать возвращаемое значение const
; фактически это устаревший шаблон в C ++ 11. Просто будь проще.)
Других решений пока нет …