So wählen Sie eine einzelne überlastung einer Funktion mit using namespace::Funktion in C++?
betrachten Sie die folgenden C++ - code.
namespace A {
void f() { //first function
}
void f(int) { //second function
}
}
...
using A::f; //introduces both functions
Gibt es eine Möglichkeit einzuführen, die nur eine Funktion?
using
immer für Bezeichner, nie auf bestimmte Personen benannt mit Ihnen. Das ist einfach so wie es ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Verhalten ist gut in der Standard.
C++03 7.3.3 The using declaration
:"...Wenn der name ist der eine überladene member-Funktion, dann werden alle Funktionen benannt werden zugänglich.".
using
keyword bringt alle Namen in den aktuellen Gültigkeitsbereich. So, mit dieser aktuellen code ist es nicht möglich.Jedoch, können Sie bewirken, dass die Namen teilweise, um die Datei als folgende:
Demo.
Bearbeiten:
Die besser Weg ist, um
A::f(int)
innerhalb einer geschachteltennamesapce
und die Einführung eines alias (für einfache Bedienung).Nun, eine andere Funktion ist auch nutzbar als
A_::f(int)
.A::f(int)
bevor es deklariert ist, so ist es natürlich nicht gefunden. Hier ist eine korrigierte version: ideone.com/2weTxNicht soweit ich weiß. Sie schreiben, könnte eine wrapper-Funktion, falls es ein problem ist.
Gebe ich dir ein paar weitere Beispiele in Ergänzung zum rest der Antworten.
Viele Bücher zur Programmierung in C++ oft setzen die ganzen STD-namespace, indem Sie die folgende Zeile irgendwo am Anfang einer Quelldatei:
Freilegung der komplette namespace wirklich passiert zu sein eine schlechte Praxis im realen Leben wegen der verschiedenen Konflikte, die auftreten können, irgendwann, besonders wenn der code geliefert, die durch viele Entwickler arbeiten an der gleichen Aufgabe. Ein solcher Programmierstil ist auch gegen eine der Grundregeln der objektorientierten Programmierung - vermeiden Sie es, mehr als es eigentlich notwendig ist durch die Kapselung Ihrer Daten. Das ist der Grund, warum Klassen zum Beispiel haben öffentliche und private Mitglieder, Getter und setter und so weiter. Namespaces sind nur ein weiterer Weg, um die Gruppe Informationen. Freilegen der gesamten std namespace wird gegen diese Regel vor allem, wenn Sie wollen, werden mit let ' s nur sagen, std::cout, std::cin und std::endl. Sie können leicht anwenden mit auf bestimmte Funktionen, die es Ihnen ermöglicht eine präzisere Kontrolle und eine höhere chance zur Vermeidung von Namenskonflikten in der mehrere namespaces, dass du vielleicht irgendwann:
Diese können Sie aufrufen, cout, cin und endl in Ihrem code ohne das namespace-Präfix. Wenn Sie einen naming-Konflikt irgendwann, es ist viel, viel einfacher Blick auf eine Reihe von mit-Richtlinien statt sich zu Fragen, wo in der ganzen namespace, den Sie aufgedeckt haben, kommt der Fehler aus.
Leute verwenden auch die mit Richtlinie für eine einzelne Funktion/variable wenn es eine Kette von namespaces oder die namespace-name ist einfach zu lang. Wenn Sie so etwas wie
oder
es ist ein Schmerz in den Hintern, um zu schreiben, das ganze jedes mal, wenn Sie wollen, rufen Sie die foo() Methode. Durch das schreiben
bzw.
sparen Sie Ihre Finger arbeiten.
Versuchen, dies zu tun:
Ist es möglich, wickeln Sie Sie in einem anderen Bereich:
Aber ich glaube nicht, Sie können tun, dass mit einem einzigen
using
Erklärung.C++ hat keinen Mechanismus, um den import einer bestimmten Funktion überlast aus einem namespace.
Als Problemumgehung können Sie wickeln Sie ein Funktionsaufruf in einer lokalen Funktion:
Dem Stichwort
static
ist sehr wichtig -f()
undA::f()
)f
wird nie aufgerufen, kein extra code generiert wird