No se C++ pero desde hace tiempo he visto codigos aca en el foro y nunca vi que pongan como pusiste vos:
bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );
Asi, como declarando la funcion y luego la dejas abajo con su cuerpo. Si fue esa linea la que hiciste mal entonces es que te esta tomando esa linea como la funcion "repite" y entonces devolvera falso siempre, lo que entonces no terminara mas el bucle do-while que hiciste luego.
Si estoy equivocado quiero que me expliquen el porque de "declarar" la funcion antes.
bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );
Asi, como declarando la funcion y luego la dejas abajo con su cuerpo. Si fue esa linea la que hiciste mal entonces es que te esta tomando esa linea como la funcion "repite" y entonces devolvera falso siempre, lo que entonces no terminara mas el bucle do-while que hiciste luego.
Si estoy equivocado quiero que me expliquen el porque de "declarar" la funcion antes.