the operator+ and operator^ are not working. Can anyone correct?.

Code:
#include <iostream>
#include <algorithm>

using namespace std;

template <class T>
class Array2D
{
    T* data;
    int w, h;
public:
    Array2D(int X, int Y) : w(X), h(Y)
    {
        data = new T[w*h];
    }
   
    ~Array2D()
    {
        if (data != NULL)
        {
            delete [] data;
            data = NULL;
        }
    }
   
    T& operator ()(int Col, int Row)
    {
        return data[Row*w+Col];
    }
   
    Array2D operator+( Array2D& m)
    {
        int w = m.width();
        int h = m.height();
        Array2D theArray2D(w,h);
        for (int r=0;r<h;r++)
        {
            for (int c=0;c<w;c++)
            {
                theArray2D(c,r)=data[c*w+r]+m(c,r);
            }
        }
        return theArray2D;
    }

    Array2D operator^( cont T& t)
    {
      //need to be filled
    }

    int width() 
    {return w;}
   
    int height() 
    {return h;}

};

int main( )
{
    int c = 5;
    int r = 6;

    Array2D<int> b(c,r);
    Array2D<int> b1(c,r);

    for(int j=0; j<r; j++)
    {
        for(int i=0; i<c; i++)
        {
            b(i,j) = i+j;
	    b1(i,j) = i+j;
        }
    }

    Array2D<int> a1 = b + b1;
    Array2D<int> a2 = b ^ 2;

    for(int j=0; j<r; j++)
    {
        for(int i=0; i<c; i++)
        {
            std::cout << a1(i,j) << "\t";
        }
        std::cout << "\n";
    }

    return 0;
}