Intnato ti conviene passare i parametri per const reference visto che non li modifichi.
Poi stai lavorando con puntatori, non con oggetti, per cui la tua funzione non verrà mai invocata (gli overload funzionano solo con oggetti, non con i puntatori).codice:bool operator<(const Persona &P1, const Persona &P2){ return P1.get_Cognome()<P2.get_Cognome();}
Infine stai usando la versione sbagliata di std::sort().
La versione corretta è il secondo overload di quella funzione:
http://www.cplusplus.com/reference/algorithm/sort/
che prende in ingresso un predicato.
Ora non hai specificato che compilatore usi.
Se compatibile C++11 puoi usare una lambda function:
Altrimenti usi un function objects o un puntatore a funzione come indicato nel link.codice:sort(VP.begin(),VP.end(), [] (const Persona* a, const Persona* b) -> bool { return *a < * b; } );
L'importante è ricordare che i parametri passati sono dei Persona*
E comunque preferibile usare un vector di shared_ptr invece che di puntatori raw. Si evitano memory leaks se non li deallochi alla fine.