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
Mary-Kate OlsenOriginal
2024-11-29 06:29:12438Durchsuche

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;
}

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:

  • 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);

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!

Stellungnahme:
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