Ich stehe vor einer Situation, aus der zwei Fragen zur Funktionsweise von ADL und Template-Funktionen unter bestimmten Umständen auftauchen.Explizite Freundesspezialisierung der Template-Funktion in der Klassenvorlage
Warum kann ich nicht verwenden cout innerhalb Freund Spezialisierung Definition? in diesem Szenario Ich erhalte einen Link-Fehler, der besagt, dass
basic_stream
ist undefiniert, aber wenn ich aufcat
aufrufen, die Kompilierung fortfahren.template<class T> void func1(T&){ ... } void cat(){ cout << "foo.func1" <<endl; } namespace first{ template<class R> struct foo{ friend void func1<>(foo<int>&){ cout << "foo.func1" <<endl; // cat(); } }; } foo<int> f; func1(f);
Warum ADL gilt nicht, wenn ich die Spezialisierung ändern, um eine Template-Klasse param zu verweisen? Wenn ich nicht falsch mit ADL-Mechanik, um die richtige Version von
func1
aufzurufenden 3 (zB global (1), oder Freund definiert eine (2)), sammelt es alle möglichen Übereinstimmungen und wählt die konkreteste ein. und ich denke, die konkreteste ist die Version vonfunc1
in 2, weil, anstatt die Funktion param als vollständig abhängig von der Vorlage param, geben Sie einen konkreten Typfoo
, diefunc1
in 1 nicht, sondern ADL wählenfunc1
in 1 sowieso. Warum das ?template<class T> void func1(T&){ // 1 ... } namespace first{ template<class R> struct foo{ friend void func1<>(foo<R>&){ // 2 cout << "foo.func1" <<endl; } }; } foo<int> f; func1(f); // 3
Meinen Sie 'erste :: foo f; '? –
aschepler
Ich glaube nicht, dass dieser Code gültig ist. Ich bekomme "Fehler: Definieren der expliziten Spezialisierung 'func1' in der Friend-Deklaration". http://coliru.stacked-crooked.com/a/728b83afb9b416a4 – aschepler
Der Code sollte nicht kompilieren, welchen Compiler verwenden Sie? – Barry