Sign in to follow this  

Matrix Operator() Overloading

This topic is 2591 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[i];
}

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

/* 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[i] = n[i];
}
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
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[i] 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

This topic is 2591 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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this