Ich habe einige Zeit versucht zu realisieren, warum mein Code nicht kompiliert und ich habe festgestellt, dass in C++ Argument abhängige Lookup Vorlage Typname verwendet Argumente, um den Namen-Lookup-Bereich zu bestimmen.Was ist der Grund hinter ADL für Argumente, deren Typ ist eine Klassenvorlage Spezialisierung
#include <string>
#include <functional>
namespace myns {
template<typename T>
struct X
{};
template<typename T>
auto ref(T) -> void
{}
} // namespace myns
auto main() -> int
{
ref(myns::X<int>{});
ref(myns::X<std::string>{}); // error: call to 'ref' is ambiguous
}
So der ehemalige ref Aufruf kompiliert, weil für myns::X<int>
nur myns::ref
betrachtet wird, während die letzteren nicht kompilieren, weil es myns::ref()
sowie std::ref
Meine Frage findet, ist, wie das sein kann sinnvoll? Warum sollte ich das brauchen? Hast du irgendwelche Ideen, Beispiele? Für den Moment sehe ich nur Nachteile wie im obigen Beispiel, wo unnötige Mehrdeutigkeiten entstehen.
Benötigen Sie Ihre Funktion, um * irgendeinen * Typ zu akzeptieren? Andernfalls wäre 'auto ref (X) -> void' eine bessere Übereinstimmung als' std :: ref' und wird durch die Überladungsauflösung ausgewählt. –
Leider ja, tue ich. – witosx