codice:
template <class T> Matrix2D<T> Matrix2D<T>::trasposta() {
	if (matrice_temp!=0)
		delete(matrice_temp);

    matrice_temp= new Matrix2D<T>(righe, colonne);  //scambia il numero di righe con il numero di colonne

    for(int i = 0; i < colonne; i++)
    {
        for (int j = 0; j < righe; j++)
            (*matrice_temp).matrice[j][i] = matrice[i][j];
    }
    return *matrice_temp;
}
uso un puntatore per evitare conflitti nella memoria durante l'esecuzione dei metodi da parte di più processi contemporaneamente.

la seconda volta che viene richiamato il metodo dà errore (access violation) quando fa la delete

ho notato che se metto nel controllo == funziona, ma non ha senso.

il puntatore nel costruttore viene inizializzato = 0.
Lo stesso controllo c'è anche nel distruttore ma dà errore anche lì.