template <class T>
class matrix
{
public:
typedef int size_type;
typedef T data_type;
typedef T& reference;
typedef const T& const_reference;
typedef vector<T> row;
typedef vector<row> rows;
size_type rc_;
size_type cc_;
rows storage_;
inline matrix(size_type M, size_type N)
:rc_(M), cc_(N), storage_(M, vector<T>(N, T())){};
inline reference operator()(size_type r, size_type c) { return
storage_.at(r).at(c);}
inline const_reference operator()(size_type r, size_type c) const { return
storage_.at(r).at(c);}
}
template<class Matrix>
Matrix::size_type rank(Matrix M)
{
//???
}