Il discriminante dell'overloading si basa sui parametri passati alla funzione, non sul tipo di ritorno.
Nel tuo caso hai solo void come parametro implicito e il compilatore non sa come scegliere che funzione invocare.
Le uniche funzioni che vengono discriminate sul tipo di ritorno sono gli operatori di conversione.
Es:
codice:
class ValAss{
    private:

        int numi;
        double numd;
        long numl;

    public:

        ValAss(); 
       ~ValAss();
       operator int();
       operator double();
       operator long();
}

...

ValAss numero;
long L = numero; // chiama operator long()
int I = numero; // chiama operator int()
double D = numero; // chiama operator double.

cout << numero << endl; // Errore! Il compilatore non sa che operatore chiamare.
cout << static_cast<int>(numero) << endl; // OK! Il compilatore invoca operator int()

return 0;
Tuttavia c'è una tecnica per poter fare l'overloadin sul risultato. La trovi qui:
http://www.eptacom.net/pubblicazioni/pub_it/nl_7.html