2010-09-16 12 views
6

Se ha formulado una pregunta similar a esta C++ Function Overloading Similar Conversions y entiendo la premisa general del problema. Buscando una solución.2 sobrecargas tienen conversiones similares

tengo 2 funciones sobrecargadas:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; 
} 

virtual IDataStoreNode* OpenNode(const char* Name,int debug=0) const { return 0; } 

De los errores Parecería que bool int y no puede ser utilizado para distinguir las sobrecargas de función.

La pregunta es, ¿hay alguna manera de evitar esto?

+0

Sospecho que el problema desaparecerá si se deshace de la malos parámetros por defecto. –

+0

Necesito leer algo más sobre los parámetros predeterminados malignos, pero si está cambiando una interfaz, son útiles. – Pradyot

Respuesta

10

bool y intpuede utilizarse para distinguir sobrecargas de funciones. Como cabría esperar, los argumentos bool preferirán bool sobrecargas y int argumentos - int sobrecargas.

A juzgar por el mensaje de error (supongo que el título de su pregunta es una parte del mensaje de error que recibió), lo que está tratando es la situación cuando el argumento que proporciona no es bool ni int, pero las conversiones a bool y int existen y tienen el mismo rango.

Por ejemplo, considere esto

void foo(bool); 
void foo(int); 

int main() { 
    foo(0);  // OK 
    foo(false); // OK 
    foo(0u); // ERROR: ambiguous 
} 

Las dos primeras llamadas se resuelven con éxito y en la forma esperada. La tercera llamada no se resolverá, porque el tipo de argumento es realmente unsigned int, que sin embargo admite conversiones implícitas a bool y int, lo que hace que la llamada sea ambigua.

¿Cómo llamas a tus funciones? Muéstranos los argumentos que estás tratando de aprobar.

2

para las siguientes funciones:

virtual IDataStoreNode* OpenNode(const char *Name, bool bCreateIfNotExist,int debug=0) { return 0; } 
virtual IDataStoreNode* OpenNode(const char* Name, int debug=0) const { return 0; } 

la siguiente llamada (como un ejemplo, puede haber otros) sería ambiguo:

unsigned int val = 0; //could be double, float 
OpenNode("", val); 

Desde un unsigned int se puede convertir en tanto bool y int, hay ambigüedad. La forma más fácil de resolver que ha de emitir el parámetro con el tipo del parámetro en su sobrecarga preferido:

OpenNode("", (bool)val); 

O

OpenNode("", (int)val); 
Cuestiones relacionadas