Wenn ich ein wenig Code wie haben:std :: Qualifikationsmerkmal benötigt, wenn überladene Namespace-Funktion existiert?
using namespace std;
namespace myNamespace
{
vector<float> sqrt(vector<float> v) { return v; }
void func()
{
vector<float> myVec = { 1, 2, 3, 4 };
std::cout << sqrt(myVec)[0] << std::endl;
float myFloat = 4.0f;
std::cout << sqrt(myFloat) << std::endl; // need to use std::sqrt()
}
}
dann wird es nicht kompilieren, wenn ich die markierte Zeile geändert std::sqrt
zu verwenden. Warum? Ich verstehe, dass, wenn ich versuchte, sqrt(float)
in neu zu definieren, dann würde ich mich mit std::
qualifizieren müssen, wenn ich die Standardbibliotheksversion verwenden wollte. Der Compiler scheint zu versuchen, myFloat
zu konvertieren, anstatt nur eine Funktion in einem anderen (std
) Namespace zu verwenden.
Ein Weg, ich, dies zu umgehen gefunden ist sqrt(vector<float>)
im std
Namensraum zu definieren, aber das ist nicht ganz richtig fühlt und Antworten auf this question vorschlagen in std
Überlastung illegal ist. Wahrscheinlich nicht der Weg zu gehen dann ...
Wie kann ich sqrt
(oder eine andere Standard-Bibliothek cmath-Funktion, für die Angelegenheit) überlasten, so dass ich nicht immer qualifizieren müssen, welche zu verwenden und den Compiler haben basierend auf den übergebenen Funktionsparametern auswählen?
Danke.
im 'std' Namespace eine eigene Funktion Deklarieren definitiv falsch ist. Sie könnten * es im globalen Namespace deklarieren, da Sie 'std' aus irgendeinem Grund dort deponiert haben. Oder Sie könnten '' std :: sqrt; '' neben Ihrem 'sqrt' in Ihren Namensraum einfügen. Ich würde nur den Namen richtig qualifizieren. –
Sie könnten auch einfach nicht verwenden Sie 'using Namespace Somethingsomething' und immer das Präfix std ::, Vermeidung von Mist wie diese insgesamt. – Cubic