2010-11-28 11 views
5

Intenté crear una clase con un operator bool y un operator void*, pero el compilador dice que son ambiguos. ¿Hay alguna manera de explicarle al compilador qué operador usar o no puedo tener ambos?define el operador void * y el operador 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

¿Seguro de que realmente se necesita tanto? 'operator void *' funciona como un 'operador bool' ligeramente más seguro porque hay menos cosas malas que puedes hacer accidentalmente con un' void * '. También google para idioma booleano seguro que minimiza el abuso aún más (definiendo un 'operador puntero-a-miembro' si no me equivoco). – UncleBens

+0

En realidad, fue en referencia a una respuesta que proporcioné para 'ifstream'. Me preguntaba por qué se llamó al operador void * antes del operador bool, pero cuando lo hice fue ambiguo. – Default

Respuesta

4

Puede llamar al operador directamente.

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

En este caso, sin embargo, parece que se deben definir operator==() y no depender de las conversiones.

+0

No parece ser necesario en [este hilo] (http://stackoverflow.com/q/4294285/238902). ¿Cómo lo soluciona 'ifstream'? – Default

+0

.. porque he visto el 'operador bool()' en istream, y en ese hilo, se llama al 'operator void *'. – Default

+0

aceptado, ya que 'operator ==()' resolvió el problema (y vamos a tener ambos operadores de conversión) – Default

8

El problema aquí es que está definiendo operator bool pero por lo que suena, lo que quiere es operator ==. Alternativamente, se puede convertir explícitamente a void * así:

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

... pero eso es realmente extraño. No hagas eso. En su lugar, definir su operator == así por dentro class A:

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

Gracias Michael, +1. Son los iostreams los que me están confundiendo ... – Default

Cuestiones relacionadas