andrei.aliashkevich
andrei.aliashkevich

Reputation: 93

c++ 11. Matrices multiplication

Hello. I write matrix class but i have some problem with matrices multiplication which have different dimensions.

template< typename T, size_t Row, size_t Col >
class Matrix
{
public:
.....................................
template< typename MulT >
auto operator * (const MulT& other) -> Matrix<T, Row, other.getColNum()>
{
    if (other.getRowNum() != getColNum())
        throw std::logic_error("Multiplication are not possible");

    Matrix<T, Row, other.getColNum()> temp;

    // Some operations.

    return temp; // Must return matrix with this type Matrix<T, Row, other.getColNum()>
                    // but it dont work.
}
.....................................
}; // class Matrix

This code don't work. It is possible to resolve this problem?

Upvotes: 0

Views: 1558

Answers (2)

GaspardP
GaspardP

Reputation: 4832

You don't want to check the if if (other.getRowNum() != getColNum()) at runtime, this should be done at compile time. One way to do this is to define the operator only for when the multiplication is valid. In this case:

template< typename T, size_t Row, size_t Col >
class Matrix
{
public:
.....................................
template<size_t _RHSWIDTH>
Matrix<_T, _RHSWIDTH, Row> operator * (const Matrix<T, _RHSWIDTH, Col> &rhs) const
{
    Matrix<_T, _RHSWIDTH, Row> temp;

    // Some operations.

    return temp;
}
.....................................
}; // class Matrix

As a result, any attempt to multiply matrices which cannot be multiplied will fail at compile time. For a complete example, I wrote a complete matrix template a long time ago which uses very similar syntax: https://github.com/Enseed/GenericGeometry/blob/master/Matrix.h

Upvotes: 0

stefan
stefan

Reputation: 10355

other.getColNum() is probably not a constexpr function and can therefore not be used as a template non-type argument.

Read up on constexpr here: http://en.cppreference.com/w/cpp/language/constexpr

Upvotes: 1

Related Questions