Heim > Backend-Entwicklung > C++ > Warum schlägt die Ableitung von Vorlagenargumenten in nicht abgeleiteten Kontexten fehl?

Warum schlägt die Ableitung von Vorlagenargumenten in nicht abgeleiteten Kontexten fehl?

Mary-Kate Olsen
Freigeben: 2024-11-29 06:29:12
Original
381 Leute haben es durchsucht

Why Does Template Argument Deduction Fail in Nondeduced Contexts?

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;
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

Fehlermeldungen:

  • Fehler 1: temp(S::type): Vorlagenargument für A konnte nicht abgeleitet werden
  • Fehler 2: temp2(S::type,B): Vorlagenargument für konnte nicht abgeleitet werden A

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage