Ich habe diesen Beispielcodemit Direktive - warum so seltsames Verhalten?
namespace ns1
{
void foo(int)
{
}
}
namespace ns2
{
void foo()
{
}
void bar()
{
using namespace ::ns1;
foo(42); // why compiler can't just call ns1::foo?
}
}
Und es mit dem Fehler nicht kompilieren:
prog.cpp:16:9: error: too many arguments to function ‘void ns2::foo()’
fand ich Grund dieses Fehlers in C++ 2003-Standard:
A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (3.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace. [Note: in this context, “contains” means “contains directly or indirectly”. ]
Ist jemand Grundprinzip für diese seltsame Regel? Warum können Namen von Namespace ns1 nicht direkt im Namespace ns2 angezeigt werden?
Da ich noch nie 'using' auf diese Weise verwendet gesehen habe, werde ich eine Vermutung wagen. Es versucht, den Namen in den aktuellen Namespace zu ziehen, und wahrscheinlich nicht so, wie Sie nur in den Funktionskontext ziehen möchten. Die Kollision der beiden Funktionen ist dann wahrscheinlich ein Problem. – Photon
Sie geben dem Compiler eine Auswahl, sowohl ns1 :: foo als auch ns2 :: foo sind im Bereich. Welchen sollte es aussuchen? Der nächste oder der am weitesten entfernte? Gefällt es Ihnen, wenn der Compiler eine globale Variable mit dem gleichen Namen als Funktionsparameter auswählt? Und wenn du "ns1 :: foo natürlich!" Warum schreibst du es nicht einfach so? –
Laut D & E macht using-directives "Namen zugänglich". Da wir (möglicherweise) nicht alle Namen kennen, die zugänglich gemacht werden, ist es konservativer und bringt sie weiter in die Namespace-Hierarchie (damit sie nicht versehentlich Namen verbergen). Der nächstgelegene einschließende Namespace könnte als gemeinsamer Teil des Programms interpretiert werden; alles Umschließende ist weniger spezialisiert, alles Umschlossene ist spezialisierter und sollte daher Vorrang haben. Aber ich rate nur. – dyp