L'errore l'ho risolto estraendo la funzione cancel() da copy() e chiamandola solo nell'operatore =.

Ora però ho un problema di segmentation fault sulla seguente moltiplicazione di matrici...

codice:
template <typename T>
Matrix<T>& Matrix<T>::operator*=(const Matrix<T>& m)
{
	if( col != m.row ) // Verifica se la moltiplicazione é definita
	{
		throw std::range_error("");
	}
	
	Matrix<T> tmp(*this); // Salva la matrice corrente in una temporanea
	
	col = m.col; // Setta le colonne della matrice per contenete la matrice risultante (le linee rimangono inalterate)
	cancel(); // Elimina i dati contenuti precedentemente
	data = new T*[row]; // Rialloca la memoria con la nuova dimensione
	for(int i(0); i < row; i++)
	{
		data[i] = new T[col];
	}
	
	for(size_t i(0); i < row; i++) // Scorre sulle line
	{
		for(size_t j(0); j < col; j++) // Scorre sulle colonne
		{
			for(size_t k(0); k < m.col; k++ ) // Somma i temrini
			{
				data[i][j] += tmp.data[i][k] * m.data[k][j];
			}
		}
	}
	
	return *this; // Ritorna la matrice corrente
}
Qualcuno sa dirmi dove sbaglio?

Grazie!