base the matrix template off of two nested std::arrays - seems nicer than using a 2D array member