2010-11-28 5 views
5

J'ai essayé de créer une classe avec un operator bool et un operator void*, mais le compilateur dit qu'ils sont ambigus. Existe-t-il un moyen d'expliquer au compilateur quel opérateur utiliser ou est-ce que je ne peux pas les avoir tous les deux?définir à la fois opérateur void * et opérateur bool

class A { 
public: 
    operator void*(){ 
     cout << "operator void* is called" << endl; 
     return 0; 
    } 

    operator bool(){ 
     cout << "operator bool is called" << endl; 
     return true; 
    } 
}; 

int main() 
{ 
    A a1, a2; 
    if (a1 == a2){ 
     cout << "hello"; 
    } 
} 
+0

Êtes-vous sûr que vous avez réellement besoin à la fois? 'operator void *' fonctionne comme un opérateur 'bool' légèrement plus sûr car il y a moins de mauvaises choses que vous pouvez faire accidentellement avec un' void * '. Aussi, google pour idiotisme bool, qui minimise les abus encore plus loin (en définissant un «pointeur d'opérateur» si je ne me trompe pas). – UncleBens

+0

En fait, c'était en référence à une réponse que j'ai fournie pour 'ifstream'. Je me demandais pourquoi l'opérateur vide * a été appelé avant l'opérateur bool, mais quand je l'ai fait c'était ambigu. – Default

Répondre

4

Vous pouvez appeler l'opérateur directement.

int main() 
{ 
    A a1, a2; 
    if (static_cast<bool>(a1) == static_cast<bool>(a2)){ 
     cout << "hello"; 
    } 
} 

Dans ce cas, cependant, il semble que vous devez définir operator==() et ne pas dépendre des conversions.

+0

Il ne semble pas être nécessaire dans [ce thread] (http://stackoverflow.com/q/4294285/238902). Comment 'ifstream' résout-il cela? – Default

+0

.. parce que j'ai vu l'opérateur 'bool()' dans istream, et dans ce thread, le 'opérateur void *' est appelé. – Default

+0

accepté cependant, puisque 'opérateur ==()' a résolu le problème (et moi avons les deux les opérateurs de conversion) – Default

8

Le problème ici est que vous définissez operator bool mais du son de ce que vous voulez est operator ==. Vous pouvez également jeter explicitement à void * comme ceci:

if ((void *)a1 == (void *)a2) { 
    // ... 
} 

... mais ce qui est vraiment bizarre. Ne fais pas ça. Au lieu de cela, définir votre operator == comme celui-ci à l'intérieur class A:

bool operator==(const A& other) const { 
    return /* whatever */; 
} 
+0

Merci Michael, +1. Ce sont les flux internes qui me confondent .. – Default