Newsgroup: it.comp.lang.c++
Titolo: Problemi di cast

Innanzi tutto salve a tutti,
    poi avrei un problemino (anche in c++ :-) )...
Meglio che vi fornisca un'esempio:
---8<--- t.cpp
#include <iostream>
using namespace std;
class A {
    /* robetta... */
public:
    A()    {    /*    fai qualcosa    */    }
    A(unsigned long ul)    {
        cout << "A(unsigned long " << ul << ")" << endl;
    }
    /*
        varie funzioni membro
    */
    operator unsigned long ()    {
         cout << "A::operator unsigned long ()" << endl;
    return 0;
    }
    bool operator>(const A& a)    {
        cout << "A::operator>(const A& a)" << endl;
        return false;
    }
};
int main()
{
    // Proviamo
    A test = 100;
   /*    facciamo tante belle cose... */
    if ( test > 0)    // questa è linea 36
         cout << "Test passato." << endl;
    else
         cout << "Test fallito." << endl;
    return 0;
}
Bene, quello che ottengo è un sibillino:
t.cpp(36) :error '>' : 2 overloads have similar conversions
Dopo averci pensato (ma perché i compilatori sono così restii a dirti
_quali_ due overload fanno a cazzotti? ) ne ho dedotto che il compiler non
sa se covertire test in unsigned long e poi confrontarlo con 0, oppure
convertire 0 in A ed invocare A::operator>. In pratica non sa se invocare
operator>(unsigned long, unsigned long) oppure operator>(A,A)
Se sbaglio ditemelo.
Quel che voglio è che accada la seconda conversione - che 0 venga letto come
A(0). Questo perché nella conversione da A a int perdo informazioni e
ottengo 0 anche quando test != A(0).
 Ovviamente se cambio la riga incriminata in
if (test > A(0))
tutto funziona, ma mi sembra davvero scomodo dover specificare ogni volta la
conversione richiesta. (Anche perché questo accade per diverse
funzioni/operatori della classe)
Output:
A(unsigned long 100)
A(unsigned long 0)
A::operator>(const A& a)
Test fallito.
Come faccio a fargli capire quale conversione attuare?
Ho notato che dichiarando operator> come
bool operator>(A& a) - togliendo cioè il const - viene eseguita la prima
conversione (unsigned long(test) > 0).
Output in questo caso:
A(unsigned long 100)
A::operator unsigned long ()
Test fallito.
---
Bye, Fox.

Ciao, grazie anticipatamente per l' aiuto.
vengo al punto:
    Sono un neofita della programmazione C/C++ e vorrei sapere come è
possibile
    comunicare verso una porta hardware in Visual C++ (uso Borland C++
Builder)
    In C ho utilizzato con successo le funzioni inportb() e outportb()
(dos.h)
    ma se le utilizzo in C++ Builder il compilatore mi dice che le funzioni
non sono
    definite.
Devo utilizzare un altra funzione, o un altro sistema?
Quale?

conversione (unsigned long(test) > 0).
Questo non me lo spiego! O meglio una mezza spiegazione
l'avrei, ma non ne sono troppo convinto!
Saluti,
Paolo
------------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
  G: Per concludere, possiamo chiedervi di commentare
     l'attuale panorama informatico?
  I: /* l'attuale panorama informatico */
------------------------------------------------------------------

    definite.
Probabilmente non hai incluso gli header, cmq ch'io sappia sono operazioni
lecite solo in dos, in win95 e superiori l'accesso diretto all'hardware e` vietato e
quando necessario bisogna ricorrere ad altre vie (di cui non mi intendo).


 _quali_ due overload fanno a cazzotti?
Il DJGPP me lo dice ed è proprio come dicevi tu. Forse dovresti
organizzare meglio la classe.
EMG

 Paolo
Ciao
Fabio
-- 
A tall, dark stranger will have more fun than you.

non sono definite.
Ovviamente, perché non hai - e non avresti potuto - includere dos.h. Come
dice anche il nome, quell'header contiene dichiarazioni di funzioni
utilizzabili solo sotto dos. Sotto windows, per accedere direttamente
all'hardware bisogna utilizzare tutt'altro.  (Le procedure cambiano a
secondo che sia 9x o nt, e non sono affatto banali. In pratica dovresti
scrivere qualcosa di molto simile ad un driver).
---
Bye, Fox/che spera di non doverlo mai fare :-).

 Forse dovresti organizzare meglio la classe.
Vedi reply a Paolo Marotta, che ne pensi?
---
Bye, Fox.

  I: /* l'attuale panorama informatico */
Bellissima 8-)) Questa č la migliore tag del '99.
---
Bye, Fox.

 Vedi reply a Paolo Marotta, che ne pensi?
Scusami ma ho perso un po' il filo del discorso.
EMG

Bellissima 8-)) Questa č la migliore tag del '99.
Non e` mia... purtroppo!
Saluti,
Paolo
------------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
  G: Per concludere, possiamo chiedervi di commentare
     l'attuale panorama informatico?
  I: /* l'attuale panorama informatico */
------------------------------------------------------------------

modificabile di A.
Uhm... sì, così quadra. Grazie.
---
Bye, Fox/infognarsi con le conversioni non è bello :-).