# Calling on an element of a matrix class

• June 2nd, 2018, 12:11 AM
luckiejacky
Calling on an element of a matrix class
The line:
Code:

`sum += (gauss[x + 2][y + 2] = exp(-(x * x + y * y) / s) / s / M_PI);`
cannot be compiled.

which says:
Code:

```1>e:\projects\c++\edge_detect\edge_detect\Matrix.h(14): error C2059: syntax error : '[' 1>          e:\projects\c++\edge_detect\edge_detect\Matrix.h(17) : see reference to class template instantiation 'matrix<T,D0,D1>' being compiled```

How can I access the following class by the [] or [][] operator and access the matrix by row or element?

Code:

```template<typename T, int D0, int D1> class matrix { public:         matrix();         matrix(const D3DXVECTOR2& m0, const D3DXVECTOR2& m1);         matrix(const D3DXVECTOR3& m0, const D3DXVECTOR3& m1, const D3DXVECTOR3& m2);                 float[4]& operator[](int row) const;         float m[4][4]; };```
Code:

```matrix<float, 5, 5> gaussian_kernel(float sigma) {     matrix<float, 5, 5> gauss;     float sum = 0, s = 2 * sigma * sigma;     for (int x = -2; x <= 2; x++)         for (int y = -2; y <= 2; y++)             sum += (gauss[x + 2][y + 2] = exp(-(x * x + y * y) / s) / s / M_PI);     for (auto& row : gauss)         for (auto& x : row)             x /= sum;     return gauss; }```
• June 2nd, 2018, 01:34 AM
wolle
Re: Calling on an element of a matrix class
Quote:

Originally Posted by luckiejacky
The line:
Code:

`sum += (gauss[x + 2][y + 2] = exp(-(x * x + y * y) / s) / s / M_PI);`
cannot be compiled.

Since the matrix class represents no abstraction why not access the m member, like
Code:

`sum += (gauss.m[x + 2][y + 2] = exp(-(x * x + y * y) / s) / s / M_PI);`
• June 2nd, 2018, 01:52 AM
luckiejacky
Re: Calling on an element of a matrix class
The original definition of the matrix is:
Code:

`template<class T, size_t Rows, size_t Cols> using matrix = std::array<std::array<T, Cols>, Rows>;`
I was unable to compie this with some low-end compilers. Should I use my method to adapt to this class, or should I seek another workaround to make this matrix class work again?
thanks
Jack
• June 2nd, 2018, 02:30 AM
wolle
Re: Calling on an element of a matrix class
Quote:

Originally Posted by luckiejacky
The original definition of the matrix is:
Code:

`template<class T, size_t Rows, size_t Cols> using matrix = std::array<std::array<T, Cols>, Rows>;`
I was unable to compie this with some low-end compilers. Should I use my method to adapt to this class, or should I seek another workaround to make this matrix class work again?

That's a nice solution and it allows for [][] accesses. It compiles with the latest VS 2017 compiler, can't you upgrade?

If not, your current matrix class approach will work with an older compiler, like
Code:

```template<class T, size_t R, size_t C> // you possibly need to use int rather than size_t class matrix { public:         T data[R][C]; }; // matrix<int, 4, 4> gauss; gauss.data[0][0] = 1; // works```
• June 2nd, 2018, 03:06 AM
luckiejacky
Re: Calling on an element of a matrix class
Thanks
• June 2nd, 2018, 08:54 PM
Marc G
Re: Calling on an element of a matrix class
A way to make your operator[] work is to implement it as follows:
Code:

```template<typename T, int D0, int D1> class matrix { public:         matrix() {};         T* operator[](int row) { return m[row]; }         T m[4][4]; };```