warning: ISO C++ forbids variable length array

Array in C++ must have a size defined at compile-time.

If you want variable length array, use std::vector instead.

In your case, I would use template for Matrix Size and have different implementation for different matrix size (unless I misunderstood your intentions).

template<int SIZE> 
    struct Matrix {
    std::array<std::array<float, SIZE>,SIZE> m;
    std::array<float,SIZE>& operator[](int a) {
        if(a>=SIZE) {
            throw std::out_of_range("Out of range exception");
        }
        return m[a];
    }
};

template<int SIZE>
void calcMatrix(Matrix<SIZE>& matrixReturnAsArray );


template<>
void calcMatrix<2>(Matrix<2>& matrixReturnAsArray )
{
     // Code for 2x2 Matrix
    std::cout << "<2>" << std::endl;
    std::cout << matrixReturnAsArray[1][1] << std::endl;
}

template<>
void calcMatrix<3>(Matrix<3>& matrixReturnAsArray )
{
     // Code for 3x3 matrix
        std::cout << "<3>" << std::endl;
        std::cout << matrixReturnAsArray[2][2] << std::endl;
}

int main() {
   std::array<float,2> a={1,2};
   Matrix<2> m2;
   m2.m = {a,a};
   std::array<float,3> b={1,2,3};
   Matrix<3> m3;
   m3.m = {b,b,b};
   calcMatrix(m3); 
   calcMatrix(m2);
}

Since I did not defined the generic template, using any other value than 2 or 3 for size will result in an error at compile time.

Edit : Used reference to std::array instead of pointer after @Caleth’s suggestion

Edit 2: Added operator [] for easy access and exception for safety

Leave a Comment