Betrachten einfachen Code:Überlastung Auflösung mit mehreren Funktionen und mehrere Konvertierungsoperatoren
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (char){}
int main() {
foo(a);
}
Above Code funktioniert gut, und wie erwartet gcc, Klirren und VC++ wählt foo(char)
.
können Sie nun den Code wenig ändern:
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (double){} //parameter changed from char to double
int main() {
foo(a);
}
Jetzt sollte diese foo(double)
wählen haben, scheint aber nur VC++ mit dem Code glücklich ist, während Klirren und gcc mit dem obigen Code unglücklich sind.
main.cpp:11:10: error: call of overloaded 'foo(A&)' is ambiguous
foo(a);
^
main.cpp:8:6: note: candidate: void foo(int)
void foo(int){}
^
main.cpp:9:6: note: candidate: void foo(double)
void foo (double){} //parameter changed from char to double
^
Kann jemand erklären, warum oben Code versagt? oder ist es ein Fehler ?.
Eine weitere Frage: Haben gcc und clang den Code der Überladungsauflösung?
1: Definieren Sie "unglücklich". 2: Was passiert, wenn Sie 'foo (int)' entfernen? – Amit
@Amit unglücklich bedeutet, dass Code abgelehnt wird, und wie für die Entfernung der Funktion 'foo (int)' ist es nicht Teil der Frage, Sie können es bitte selbst versuchen. –
@AngelusMortis: Welche Funktion wählt VC++? – davidhigh