Ciao a tutti. Ho un'errore di allocazione in una classe che sto creando, che rappresenta delle matrici.

Questa é l'istruzione che da problemi:
codice:
cout << m1 + m4 + m4 + m4 << endl;
Viene quindi chiamata la funzione operator+:
codice:
template <typename T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& m) const
{
	if( (row != m.row) or (col != m.col) )
	{
		throw std::range_error("");
	}

	Matrix<T> tmp(*this);
	
	for(int i(0); i < row; i++)
	{
		for(int j(0); j < col; j++)
		{
			tmp.data[i][j] += m.data[i][j];
		}
	}
	
	return std::move(tmp);
}
Penso che l'operatore sia giusto e che quindi l'errore si trovi nell'invocazione del costruttore di copia:
codice:
template <typename T>
Matrix<T>::Matrix(const Matrix<T>& m)
{
	copy(m);
}
E quindi nella funzione copy:
codice:
template <typename T>
void Matrix<T>::copy(const Matrix<T>& m)
{
	row = m.row;
	col = m.col;
	
	cancel();
	
	data = new T*[row];
	for(int i(0); i < row; i++)
	{
		data[i] = new T[col];
	}
	
	for(int i(0); i < row; i++)
	{
		for(int j(0); j < col; j++)
		{
			data[i][j] = m.data[i][j];
		}
	}
}

template <typename T>
void Matrix<T>::cancel()
{
	for(int i(0); i < row; i++)
	{
		delete data[i];
	}
	
	delete data;
	data = nullptr;
}
Grazie,
R.

Ps: Ho già aperto una discussione riguardante quella classe ma trovo più corretto (soprattutto per chi utilizza il tasto "cerca") aprire una nuova discussione per questo errore specifico...