Mit Deklaration Namen in einem anderen Namensraum zu bewegen?
-
29-09-2019 - |
Frage
Gegeben:
namespace One {
void foo(int x) {
munch(x + 1);
}
};
namespace Two {
// ... see later
}
...
void somewhere() {
using namespace Two;
foo(42);
...
gibt es einen Unterschied zwischen den beiden folgenden Varianten:
a)
namespace Two {
void foo(int x) {
munch(x + 1);
}
};
und b)
namespace Two {
using One::foo;
};
EDIT: Es ist ziemlich klar, dass (a) dupliziert den Code, der nie eine gute Idee sein sollte. Die Frage ist, mehr über die Überladungsauflösung usw. ... was, wenn es andere foo
s oder munch
es in möglicherweise anderen Namespaces?
Lösung
Mit einem, sie sind tatsächlich verschiedene Funktionen, aber mit b sind die beiden Funktionen identisch:
assert(&One::foo == &Two::foo);
Dies würde selten Rolle; eine größere Sorge ist die Logik duplizieren.
Andere Tipps
Wie für die Nutzung sie gleichwertig sind. Wie für den Code, sind Duplizieren im Fall a) Sie die Funktion foo()
Code. Das heißt, beide Versionen die foo()
Funktion innerhalb Two
zur Verfügung stellen, aber der a) Fall generiert den Code für foo
zweimal, weil der Compiler keinen Hinweis hat entdecken sie die gleiche Funktion ist.