2010-09-16 4 views
6

Une question similaire à ce C++ Function Overloading Similar Conversions a été posée et je comprends la prémisse générale du problème. Vous cherchez une solution.2 surcharges ont des conversions similaires

J'ai 2 fonctions surchargées:

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; } 

Des erreurs, il semblerait que bool et int ne peut pas être utilisé pour distinguer la fonction de surcharge. La question est: y a-t-il un moyen de contourner ce problème?

+0

Je pense que votre problème disparaîtra si vous vous débarrasser de la mauvais paramètres par défaut. –

+0

J'ai besoin de lire un peu plus sur les paramètres par défaut mal, mais si vous changez une interface, ils sont utiles. – Pradyot

Répondre

10

bool et intpeut être utilisé pour distinguer les surcharges de fonction. Comme on peut s'y attendre, les arguments bool préféreront bool surcharges et int arguments - int surcharges. A en juger par le message d'erreur (je suppose que le titre de votre question fait partie du message d'erreur que vous avez reçu), il s'agit de la situation lorsque l'argument que vous fournissez n'est ni bool ni int, mais des conversions à bool et int existent et ont le même rang.

Par exemple, considérons ce

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

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

Les deux premiers appels résoudront avec succès et de manière attendue. Le troisième appel ne sera pas résolu, car le type d'argument est en réalité unsigned int, qui prend toutefois en charge les conversions implicites à bool et int, ce qui rend l'appel ambigu.

Comment appelez-vous vos fonctions? Montrez-nous les arguments que vous essayez de transmettre.

2

Pour les fonctions suivantes:

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; } 

L'appel suivant (à titre d'exemple, il pourrait y avoir d'autres) serait ambiguë:

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

Puisqu'un unsigned int peut être converti à la fois bool et int, il y a ambiguïté. La meilleure façon de le résoudre est de lancer le paramètre du type de paramètre dans votre surcharge préféré:

OpenNode("", (bool)val); 

OU

OpenNode("", (int)val); 
Questions connexes