Jump to content
  • Advertisement
Sign in to follow this  
SaLiVa

Matrix Operator() Overloading

This topic is 2803 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I am having problems with the compiler saying "expression must have (pointer-to-) function type" in the multiplication part of a Matrix.

Here are some snippets of the essential parts of the code.



class mat2
{
public:
/* Constructors and Deconstructors */
// No arguments gives an Identity Matrix
mat2() {
Identity(1.0f);
}
mat2(const float c) {
Identity(c);
}

mat2(const float c0, const float c1,
const float c2, const float c3) {
m[0] = c0;
m[1] = c1;
m[2] = c2;
m[3] = c3;
}
mat2(const mat2 &n) {
*this = n;
}
~mat2() {}

/* Array operator */
float &operator[] (int i);
const float &operator[] (int i) const;

const float &operator() (unsigned int i, unsigned int j) const;
float &operator() (unsigned int i, unsigned int j);

/* Arithmetic operators */
mat2 &operator=(const mat2 &n);
mat2 operator*(const mat2 &n);
mat2 operator*=(const mat2 &n);


protected:
// This is arranged in rows format
// Each row contains one 2D Vector
enum {
mat2lim = 4, row2lim = 2, col2lim = 2
};
float m[mat2lim];
};




And here's the definitions of the class functions.

 

inline float &mat2::operator[] (int i) {
return m;
}

inline const float &mat2::operator[] (int i) const {
return m;
}

/* Parenthesis operator */
const float &mat2::operator() (unsigned int i, unsigned int j) const {
return m[(i * row2lim) + j];
}

float &mat2::operator() (unsigned int i, unsigned int j) {
// Row based matrix index
return m[(i * row2lim) + j];
}

/* Arithmetic operators */
inline mat2 &mat2::operator=(const mat2 &n) {
for(int i = 0; i < mat2lim; i++) {
m = n;
}
return *this;
}

inline mat2 mat2::operator*(const mat2 &n) {
mat2 r;

r.m(0, 0) = m(0, 0) * n.m(0, 0) + m(0, 1) * n.m(1, 0); // r[0][0]
r.m(0, 1) = m(0, 0) * n.m(0, 1) + m(0, 1) * n.m(1, 1); // r[0][1]
r.m(1, 0) = m(1, 0) * n.m(0, 0) + m(1, 1) * n.m(1, 0), // r[1][0]
r.m(1, 1) = m(1, 0) * n.m(0, 1) + m(1, 1) * n.m(1, 1); // r[1][1]
return(r);
}




The last part mat2::operator* is where the error occurs.
I am unsure what the problem is because there has been only one resource that has given me any clue of the overloading of the operator() for this purpose.
http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10

Can anyone point me in the right direction on fixing this matter?
Thanks

Share this post


Link to post
Share on other sites
Advertisement
The member variable, m, is a one dimensional array of floats, overloading operator() has not changed this and so you cannot access elements from m using m(i,j) syntax, only m syntax.
Probably what you mean do be doing is invoking mat2::operator() on instances of mat2, for example:

r(0, 0) = (*this)(0, 0) * n(0, 0) + (*this)(0, 1) * n(1, 0); // r[0][0]
etc..

Share this post


Link to post
Share on other sites
OMG!!!!! WOW! I spent the better half of the day doing all sorts of stupid stuff and all it was was to remove the .m's?!?!?

I could kiss you right now!
Thanks a lot!

Share this post


Link to post
Share on other sites
It might be slightly more readable to rebind "this" as a reference:

const mat2 &self = *this;
r(0, 0) = self(0, 0) * n(0, 0) + self(0, 1) * n(1, 0); // r[0][0]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!