Ein Fehler in C ++ - Überladungsauflösungsregeln?

8

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?

    
cppalex 25.02.2016, 17:23
quelle

2 Antworten

10

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:

%Vor%

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.

    
Barry 25.02.2016 17:38
quelle
0

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:

%Vor%

Live-Beispiel

Der Namespace f(A) fungiert dann als die breitere Schnittstelle von ns1 bis ADL.

    
TemplateRex 25.02.2016 20:22
quelle