Betrachten Sie den folgenden Code:
%Vor%Die Kompilierung schlägt mit einem "mehrdeutigen Überlastungsfehler" gemäß Standard fehl.
Aber warum? Sicherlich sollte der "gleich gute" Operator im Heimat-Namespace von A Vorrang haben. Gibt es einen logischen Grund, es nicht zu tun?
Wenn Sie möchten, dass die Überladung in namespace A
bevorzugt wird, müssen Sie etwas hinzufügen, um es tatsächlich besser zu machen. Sagen Sie, indem Sie es nicht zu einer Vorlage machen:
Andernfalls gibt es wirklich keinen konzeptuellen Grund zu sehen, warum eine Funktionsvorlage in einem Namespace einer Funktionsvorlage in einem anderen Namespace vorgezogen wird, wenn beide genau gleichwertig sind. Warum sollte die Funktionsvorlage im A
-Namespace "besser" sein als die Funktionsvorlage im% code_% -Space? Wäre der Implementierer von f
nicht "besser"? Die ausschließliche Verwendung der Funktionssignatur verhindert dieses Problem.
Wenn Sie die Compiler-Fehler sorgfältig lesen, liegt der Mehrdeutigkeitsfehler nicht zwischen den operator<<
Versionen in ns1
und ns2
, sondern zwischen der operator<<(os, const char*)
Instanziierung von ns1
und der exakt gleichen Überladung von% Code%. Letzteres wird von ADL auf namespace std
gezogen.
Der beste Ansatz besteht darin, die Empfehlung von @Barry zu verwenden und die std::ostream
im Namespace operator<<
zu entemplatieren, aber auch alle mit ns1
(wie ns1::A
) in Verbindung stehenden Funktionen hinzuzufügen Namensraum:
Der Namespace f(A)
fungiert dann als die breitere Schnittstelle von ns1
bis ADL.
Tags und Links c++ namespaces templates language-lawyer overload-resolution