Hola; y bien, me alegra saber que la primera de las cuestiones haya quedado resuelta.
Ésta de ahora es una cuestión bien diferente, pero puedo comentarte algunas cosas que veo:
-- en operator+ (), en la línea
Cita: result.matrix[i][j]=matrix[i][j]+m_2.matrix[i][j]; //justo aqui
el error se debe a que estás queriendo acceder a un miembro que efectivamente has declarado como private; y, esa es la idea de la función pública value(), ¿verdad?
-- Otro error es que si a la función operator+ () le pasas una referencia constante, vas a necesitar agregar el calificador const a las funciones miembros que no modifican los estados:
T value(int, int)
const;
-- Hay otras cosillas que tienen más que ver con el diseño, pero no es el caso.
-- (Y ah, por cierto, no te olvides de liberar la memoria asignada en el destructor)
Saludos!
Lareto :)