Abzug von Vorlagenargumenten und nicht abgeleitete Kontexte
In C ermöglicht der Abzug von Vorlagenargumenten dem Compiler, die Typen von Vorlagenparametern basierend auf den Typen zu bestimmen der an die Vorlagenfunktion oder -klasse übergebenen Argumente. Dieser Mechanismus kann jedoch in bestimmten Szenarien mit nicht abgeleiteten Kontexten fehlschlagen.
Bedenken Sie den folgenden Codeausschnitt:
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
Hier dient die S-Struktur als Möglichkeit, einen Verweis auf den Typ zu erhalten wird vom Vorlagenparameter A gehalten. Wenn jedoch versucht wird, diese Funktionen mit ganzzahligen Werten aufzurufen, wie unten gezeigt, meldet der Compiler eine Meldung Fehler:
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
Fehlermeldungen:
Erklärung:
Das Problem entsteht, weil der Typ von A ausschließlich in einem nicht abgeleiteten Kontext verwendet wird, was bedeutet, dass der Compiler ihn nicht aus den Argumenten ableiten kann an die Funktionen übergeben. Insbesondere gilt S::type als nicht abgeleitet, da es innerhalb eines verschachtelten Vorlagentyps erscheint und nicht in direktem Zusammenhang mit den Argumenten von temp oder temp2 steht.
Lösung:
Um dieses Problem zu beheben und die Ableitung von Vorlagenargumenten zu ermöglichen, muss der Typ von A beim Aufruf der Funktionen explizit angegeben werden, wie gezeigt unten:
temp<char>(c);
Diese explizite Spezifikation ermöglicht es dem Compiler, den Typ von A zu bestimmen und die Vorlagenfunktionen erfolgreich zu instanziieren.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung von Vorlagenargumenten in nicht abgeleiteten Kontexten fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!