Betrachten Sie den folgenden Code ein:Ein Fehler in C++ - Überladungsauflösungsregeln?
#include <iostream>
namespace ns1
{
struct A
{
};
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns1::print" << std::endl;
}
}
namespace ns2
{
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns2::print" << std::endl;
}
void f (const ns1::A& a)
{
std::cout << a;
}
}
int main()
{
ns1::A a;
ns2::f (a);
return 0;
}
Compilation nicht mit "mehrdeutig Überlastung Fehler" gemäß der Norm.
Aber warum? Sicherlich sollte der "gleich gute" Operator im Heimat-Namespace von A Vorrang haben. Gibt es einen logischen Grund, es nicht zu tun?
Warum sollten Funktionen im Home-Namespace von "A" Vorrang vor Funktionen im Namespace der aufrufenden Funktion "f" haben? Es gibt keinen Weg um dieses mehrdeutig zu sein. Ein Fehler ist das einzig Vernünftige. –
Weil derjenige, der als Namespace erstellt hat, besser weiß, wie A gedruckt werden soll? – cppalex
Zunächst einmal sind sie Vorlagen. Wenn die Person, die "A" erstellt hat, ein bestimmtes Verhalten für das Drucken von Objekten des Typs "A" sicherstellen wollte, hätte dies entweder eine Überladung oder Spezialisierung bewirkt. Das hätte die Zweideutigkeit hier gelöst. Zweitens können Namespaces mehrere Male geöffnet und geschlossen werden, so dass die Funktion möglicherweise nicht einmal von dem Implementierer von "A" bereitgestellt wurde. –