2010-09-16 10 views
6

Eine ähnliche Frage zu diesem C++ Function Overloading Similar Conversions wurde gefragt und ich verstehe die allgemeine Prämisse des Problems. Auf der Suche nach einer Lösung.2 Überladungen haben ähnliche Umwandlungen

Ich habe 2 ladenen Funktionen:

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

Aus den Fehler wäre es, dass Bool erscheinen und int kann nicht verwendet werden Funktion Überlastungen zu unterscheiden.

Die Frage ist, gibt es eine Möglichkeit, um dies zu umgehen?

+0

Ich vermute, dass Ihr Problem weggeht, wenn Sie von der loswerden böse Standardparameter. –

+0

Ich muss etwas über böse Standardparameter lesen, aber wenn Sie eine Schnittstelle ändern, sind sie praktisch. – Pradyot

Antwort

10

bool und intkann verwendet werden, um Funktionsüberlastungen zu unterscheiden. Wie man erwarten würde, bool Argumente bevorzugen bool Überladungen und int Argumente - int Überladungen.

Nach der Fehlermeldung zu urteilen (ich nehme an, dass der Titel Ihrer Frage ein Teil der Fehlermeldung ist), die Sie haben, ist die Situation, wenn das Argument Sie liefern weder bool noch int, noch Konvertierungen zu bool und int existieren und haben den gleichen Rang.

Betrachten wir zum Beispiel diese

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

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

Die ersten beiden Anrufe erfolgreich lösen wird und der erwarteten Weise. Der dritte Aufruf wird nicht aufgelöst, da der Argumenttyp tatsächlich unsigned int ist, der jedoch implizite Konvertierungen sowohl in bool als auch in int unterstützt, wodurch der Aufruf mehrdeutig wird.

Wie rufen Sie Ihre Funktionen an? Zeigen Sie uns die Argumente, die Sie vermitteln wollen.

2

Für folgende Funktionen:

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

Der folgende Aufruf (als Beispiel, könnte es andere sein) wäre zweideutig:

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

Da ein unsigned int kann sowohl bool umgewandelt werden und int, gibt es Mehrdeutigkeit. Der einfachste Weg, um es zu lösen ist, den Parameter auf den Typ des Parameters in Ihrer bevorzugten Überlastung zu werfen:

OpenNode("", (bool)val); 

ODER

OpenNode("", (int)val); 
Verwandte Themen