Ich habe einige Zeit damit verbracht herauszufinden, warum mein Code nicht kompiliert wird, und ich habe festgestellt, dass in C ++ Argumentabhängige Suche Vorlagennamen-Argumente verwendet, um den Namen-Lookup-Bereich zu bestimmen.
%Vor% Also kompiliert der ehemalige Verweisaufruf, weil für myns::X<int>
nur myns::ref
berücksichtigt wird, während letzterer nicht kompiliert wird, weil er myns::ref()
sowie std::ref
Meine Frage ist wie kann das nützlich sein? Warum sollte ich das brauchen? Hast du irgendwelche Ideen, Beispiele? Im Moment sehe ich nur Nachteile wie im obigen Beispiel, wo es unnötige Zweideutigkeiten hervorruft.
Angenommen, Sie fügen alle Dinge in Ihren eigenen Namespace ein, einschließlich einer benutzerdefinierten Klasse und einer Funktion, die std::vector
als Parameter akzeptiert. d. h.
Dann können Sie die Tatsache ausnutzen, dass ADL auch die Typen berücksichtigt, die als Template-Argumente zur Verfügung gestellt werden schreib einfach:
%Vor%andererseits:
%Vor%Gehen Sie zurück zu Ihrer ursprünglichen Frage, die Lektion hier ist, verwenden Sie keine Namen aus Standard-Bibliotheken, es macht nur Codes verwirrend.
In einem Wort: Wiederverwendung. Es ermöglicht Ihnen, nützliche Komponenten aus anderen Bibliotheken zu verwenden und weiterhin ADL angewendet zu haben.
Zum Beispiel:
%Vor%Nun können Sie natürlich Code schreiben, wie Sie es direkt mit der Klasse tun würden:
%Vor%Wenn dies nicht der Fall ist, müssen Sie Ihren eigenen Smart Pointer in Ihrem eigenen Namespace implementieren, um gute Codierungs-Idiome und ADL zu ermöglichen.
Tags und Links c++ templates argument-dependent-lookup