Cuando tu escribes en el main algo como:
clase a;
cin >> a; // (1)
El compilador sustituye la línea (1) por:
operator>>(cin, a);
Y el operador que has escrito manualmente es llamado de forma implícita.
De hecho, excepto para tipos primitos (enteros, chars, punteros), todo operador no es más que una función con un nombre especial (operator bla bla bla), y cuando utilizas el operador, éste siempre es sustituído por la forma con sintáxis de llamada a función (tú también podrías escribirlo así en el código si quisieras, pero por supuesto, ese no es el objetivo; para eso crearías una función y la llamarías por su nombre, mejor que con `operator>>(/* lo que sea*/`).
Bueno, en realidad es algo más complejo. El compilador sustituiría la llamada anterior por:
operator>>(cin, a); // (1)
// Pero tambien por:
cin.operator>>(a); // (2)
Y se queda con la versión que exista de los dos. En tu caso, debido a que el `operator>>` es externo a la clase iostream (dado que no puedes modificar la clase `iostream` para añadirlo), la versión (2) falla al no existir tal método dentro de la clase `iostream`, luego solo queda la (1), que por supuesto, no falla dado que ya la has definido.
Si no hubiera sobrecarga adecuada ni para (1) ni para (2), ni siquiera tras posibles conversiones implícitas, o hubiese sobrecargas para ambas, se produciría el error de compilación pertinente.