Namensräume und Überladen von Operatoren in C ++
-
05-07-2019 - |
Frage
Wenn Sie eine Bibliothek in einem bestimmten Namespace-Authoring, ist es oft bequem in diesem Namensraum überladene Operatoren für die Klassen zur Verfügung zu stellen. Es scheint (zumindest mit g ++), dass die überladenen Operatoren implementiert werden können entweder in der Bibliothek des Namespace:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
oder der globale Namespace
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
Von meinen Tests, scheinen sie beide gut zu funktionieren. Gibt es einen praktischen Unterschied zwischen diesen beiden Optionen? Entweder Ansatz besser?
Lösung
Sie sollten sie in der Bibliothek Namensraum definieren. Der Compiler wird sie trotzdem durch Argument abhängige Lookup finden.
Keine Notwendigkeit, den globalen Namensraum verschmutzen.
Andere Tipps
Um es in die Bibliothek Namespace funktioniert, weil die Koenig-Lookup .
Sie sollten es im Namensraum definieren, da sowohl die Syntax weniger ausführlich sein und nicht den globalen Namensraum Krempel.
Eigentlich, wenn Sie Ihre Überlastungen in Ihrer Klassendefinition definieren, wird dies eine offene Frage:
namespace Lib {
class A {
public:
A operator+(const A&);
};
} // namespace Lib