I'm discovering C++ and I would like to create a mini mathematic Matrix librairy using templates.
Here, I want to overload the operator*.
If i describe a matrix like this: M(y, x) with M the matrix name, y and x the height and the width, a matrix multiplication should look like that:
M(a, b) * N(b, c) = R(a, c)
Currently I have this code:
template<unsigned int y, unsigned int x>
class Matrix
{
public:
    Matrix() { }
    ~Matrix() { }
    Matrix<y, x2>& operator*(const Matrix<y2, x2>& right)
    {
        // code...  
    }
private:
    std::array<std::array<double, x>, y>    m_values;
};
So I would like to be able to multiply two differents matrix like that:
Matrix<3, 4> m;
Matrix<4, 2> n;
// fill the matrix with values
Matrix<3, 2> o = m * n;
I've searched but I didn't find the answer to this question (maybe because I don't really know what I must search exactly).
Thanks for your help :)
You need to make your operator* a template member function, something like so:
template <unsigned int y2, unsigned int x2>
Matrix<y, x2> operator*(const Matrix<y2, x2>& right)
{
    // code...  
}
Notice that the return type is no longer a reference, as operator* should return a new value -- if you like, you can define a complementary operator*= which modifies the LHS matrix in-place.
Another thing to notice is that matrix multiplication only makes sense if the dimensions of the matrices agree: that is, if the number of columns in the LHS matches the number of rows in the RHS. To enforce this, you could use a static_assert within your member function to make sure that the template parameters agree:
template <unsigned int y2, unsigned int x2>
Matrix<y, x2> operator*(const Matrix<y2, x2>& right)
{
    static_assert(y2 == x, "Matrix dimensions mismatched");
    // code...
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With